Quando usare `request`,` load` o `autoload` in Ruby?
Domanda
Comprendo le sottili differenze tra richiedono
, carica
e autoload
in Ruby, ma la mia domanda è: come fai a sapere quale uso?
Oltre a poter "avvolgere " un carica
in un modulo anonimo, richiedi
sembra essere preferito.
Ma poi autoload
ti permette di caricare i file in modo pigro - il che suona fantastico ma non sono sicuro praticamente ciò che guadagni su richiedono
È preferibile un metodo rispetto all'altro? C'è una situazione in cui un metodo si distingue?
Soluzione
Generalmente, dovresti usare richiedi
. load
ricaricherà il codice ogni volta, quindi se lo fai da più moduli, dovrai fare molto lavoro extra. La pigrizia di autoload
suona bene in teoria, ma molti moduli di Ruby fanno cose come l'applicazione di patch di scimmia ad altre classi, il che significa che il comportamento di parti non correlate del programma può dipendere dal fatto che una determinata classe sia stata utilizzata ancora o no. autoload
è in procinto di essere deprecato , quindi il suo utilizzo dovrebbe essere evitato.
Se vuoi creare il tuo ricaricatore automatico che carica il tuo codice ogni volta che cambia o ogni volta che qualcuno colpisce un URL (per scopi di sviluppo, quindi non devi riavviare il tuo server ogni volta), quindi usa caricare
per questo è ragionevole.
Altri suggerimenti
mylibrary.rb
puts "I was loaded!"
class MyLibrary
end
Prova in irb
irb(main):001:0> require 'mylibrary'
I was loaded!
=> true
irb(main):001:0> autoload :MyLibrary, 'mylibrary'
=> nil
irb(main):002:0> MyLibrary.new
I was loaded!
=> #<MyLibrary:0x0b1jef>
Vedi la differenza.
ecco cosa ottieni con caricamento automatico
su richiedi
:
autoload
serve principalmente per accelerare la fase di inizializzazione del programma Ruby o dell'applicazione Rails. Non caricando le risorse fino a quando non sono necessarie, può accelerare un po 'le cose.
Un altro vantaggio è che potrebbe non essere necessario caricare alcune parti del codice, se l'utente non utilizza determinate funzionalità, migliorando così il tempo di caricamento e riducendo il footprint di memoria.
A parte ciò che altri ti hanno già detto, il futuro di caricamento automatico
è incerto. È stato pianificato di essere deprecato in Ruby 2.0, ma la deprecazione non è stata effettuata in tempo per il blocco delle funzionalità 2.0. Ora si prevede che autoload
sarà deprecato in Ruby 2.1, ma questo è nemmeno più certo .