2009-04-29 20 views
49

Entiendo las diferencias sutiles entre require, load y autoload en Ruby, pero mi pregunta es, ¿cómo sabes cuál usar?Cuándo usar `require`,` load` o `autoload` en Ruby?

Aparte de ser capaz de "ajustar" un load en un módulo anónimo, require parece ser el preferido.

Pero entonces autoload le permite cargar archivos perezosos - que suena fantástico, pero no estoy seguro de lo que ganas prácticamente sobre require

es un método preferido sobre el otro? ¿Hay alguna situación en la que un método se destaque?

Respuesta

50

Generalmente, debe usar require. load volverá a cargar el código cada vez, por lo que si lo hace desde varios módulos, estará 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 aplicar parches 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 has also been deprecated, por lo que se debe evitar su uso.

Si desea hacer su propia recargador automática que carga el código cada vez que cambia o cada vez que alguien realiza un URL (para fines de desarrollo por lo que no es necesario reiniciar el servidor cada vez), a continuación, utilizando para load eso es razonable

+14

Creo que 'autoload' quedará obsoleto en futuras versiones de Ruby, según un [comentario] (http://www.ruby-forum.com/topic/3036681) de matz. –

+2

Consulte la respuesta de Boris a continuación que contiene un enlace a una discusión más reciente sobre autocarga. Todavía está presente en 2.1: http://ruby-doc.org/core-2.1.0/Module.html#method-i-autoload –

+3

Aquí estamos 7 años después de esta respuesta publicada. ¿Ha sido desaprobada la autocarga? – Donato

10

aquí es lo que se gana con autoload sobre require:

autoload es principalmente para acelerar la fase de inicialización de su programa o aplicación de Ruby Rails. Al no cargar los recursos hasta que se necesiten, puede acelerar bastante las cosas.

Otra ventaja es que puede que no sea necesario cargar algunas partes del código, si el usuario no utiliza ciertas características, lo que mejora el tiempo de carga y reduce la huella de memoria.

14

mylibrary.rb

puts "I was loaded!" 

class MyLibrary 
end 

Trate de 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.

+3

La pregunta asker conoce la diferencia entre require y autocarga, él estaba preguntando cuándo debería usar uno en lugar de otro. –

+1

Gracias Andrew por señalarlo. Tienes razón. Como se mencionó anteriormente en user979339 ..autoload debe usarse donde el tiempo es crítico y aún así desea acelerar el proceso. Por ejemplo, en los servidores de aplicaciones como "delgado". Si miras el código fuente delgado, entonces descubrirás que el autor ha usado la función de carga automática en lugar de la requerida para cargar las partes del núcleo delgadas como comando, conexión y registro, esta velocidad aumenta la inicialización. – crazycrv

+0

Debe tener cuidado con las bibliotecas que no están registradas con Ruby stdlib y rubygems, por lo que es necesario './filename-no ext' como ejemplo para una lib local. ¿Tal vez podrías arreglar esto en tu código y luego eliminar mi comentario? Pero gracias por el simple ejemplo. ¿Pero qué pasa con 'cargar'? –

6

Aparte de lo que otros ya le han dicho, el futuro de autoload es incierto. Estaba programado para ser obsoleto en Ruby 2.0, pero la desaprobación no se realizó a tiempo para la congelación de la característica 2.0. Ahora se espera que autoload estará en desuso en Ruby 2.1, but that is not even certain anymore.

Cuestiones relacionadas