¿Cuándo usar `require`,` load` o `autoload` en Ruby?
include module ruby (4)
Entiendo las diferencias sutiles entre la require
, la load
y la load
autoload
en Ruby, pero mi pregunta es, ¿cómo saber cuál usar?
Además de poder "envolver" una load
en un módulo anónimo, parece que se require
.
Pero luego la autoload
te permite cargar archivos de forma lenta, lo que suena fantástico, pero no estoy seguro de que prácticamente lo que ganes require
¿Se prefiere un método sobre el otro? ¿Hay una situación donde se destaca un método?
Aparte de lo que otros ya han dicho, el futuro de la autoload
es incierto. Estaba programado para ser desaprobado en Ruby 2.0, pero no se hizo a tiempo para la congelación de características 2.0. Ahora se espera que la autoload
esté en desuso en Ruby 2.1, pero eso ya no es seguro .
En general, deberías usar require
. load
volverá a cargar el código cada vez, por lo que si lo haces desde varios módulos, estarás haciendo mucho trabajo adicional. La pereza de la autoload
suena bien en teoría, pero muchos módulos de Ruby hacen cosas como parchar a otras clases, lo que significa que el comportamiento de partes no relacionadas de su programa puede depender de si una clase determinada se ha utilizado o no. autoload
está en proceso de ser desaprobada , por lo que debe evitarse su uso.
Si desea crear su propio recargador automático que carga su código cada vez que cambia o cada vez que alguien ingresa a una URL (para propósitos de desarrollo, de modo que no tenga que reiniciar su servidor cada vez), entonces usar la load
es razonable.
Esto es lo que obtienes con la autoload
sobre:
autoload
es principalmente para acelerar la fase de inicialización de su programa Ruby o la 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.
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.