ruby module

¿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.