¿Cuándo usar `require`,` load` o `autoload` en Ruby?
Pregunta
Entiendo las sutiles diferencias entre require
, load
y autoload
en Ruby, pero mi pregunta es, ¿cómo sabes cuál elegir? ¿utilizar?
Aparte de poder envolver " un load
en un módulo anónimo, require
parece ser el preferido.
Pero luego autoload
le permite cargar archivos de manera diferida, lo que suena fantástico, pero no estoy seguro de lo que gana con require
¿Se prefiere un método sobre el otro? ¿Hay una situación en la que se destaca un método?
Solución
En general, debe usar require
. load
volverá a cargar el código cada vez, así que si lo haces desde varios módulos, estarás haciendo un montón de trabajo adicional. La pereza de autoload
suena bien en teoría, pero muchos módulos de Ruby hacen cosas como parchar el mono a otras clases, lo que significa que el comportamiento de partes no relacionadas de su programa puede depender de si se ha utilizado una clase determinada aun o no autoload
está en proceso de ser desaprobado , por lo que su uso debe evitarse.
Si desea crear su propio cargador automático que carga su código cada vez que cambia o cada vez que alguien ingresa a una URL (para fines de desarrollo, de modo que no tenga que reiniciar su servidor cada vez), utilice la carga
para eso es razonable.
Otros consejos
mylibrary.rb
puts "I was loaded!"
class MyLibrary
end
Prueba en 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>
Ver la diferencia.
Esto es lo que gana con carga automática
sobre require
:
autoload
es principalmente para acelerar la fase de inicialización de su programa Ruby o aplicación Rails. Al no cargar los recursos hasta que se necesiten, puede acelerar las cosas bastante.
Otra ventaja es que es posible que no necesite cargar algunas partes del código, si el usuario no usa ciertas funciones, lo que mejora el tiempo de carga y reduce la huella de memoria.
Aparte de lo que otros ya le han dicho, el futuro de autoload
es incierto. Estaba programado para ser desaprobado en Ruby 2.0, pero la desaprobación no se hizo a tiempo para el congelamiento de la característica 2.0. Ahora se espera que autoload
esté en desuso en Ruby 2.1, pero eso es ni siquiera estoy seguro .