Quando usar `require`,` load` ou `autoload` em Ruby?
Pergunta
Eu entendo as sutis diferenças entre require
, load
e autoload
em Ruby, mas a minha pergunta é, como você sabe qual usar?
Além de ser capaz de "embrulhar" um load
em um módulo anônimo, require
parece ser o preferido.
Mas então autoload
permite carregar arquivos preguiçosos - que soa fantástico, mas eu não tenho certeza praticamente o que você ganha ao longo require
é um método preferido sobre o outro? Existe uma situação em que um método se destaca?
Solução
Geralmente, você deve usar require
. load
vai voltar a carregar o código de cada vez, por isso, se você fazê-lo a partir de vários módulos, você estará fazendo um monte de trabalho extra. A preguiça de autoload
parece bom em teoria, mas muitos módulos de Ruby fazer coisas como-remendar macaco outras classes, o que significa que o comportamento das partes não relacionadas de seu programa pode depender se uma determinada classe ainda não foi ou não utilizado. autoload
está no processo de ser descontinuada , pelo que a sua utilização deve ser evitada.
Se você quiser fazer o seu próprio reloader automática que carrega o código de cada vez que muda ou a cada vez que alguém bate uma URL (para fins de desenvolvimento, assim você não tem que reiniciar o servidor de cada vez), em seguida, usando load
para esse é razoável.
Outras dicas
mylibrary.rb
puts "I was loaded!"
class MyLibrary
end
Tente no 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>
Veja a diferença.
aqui está o que você ganha com autoload
sobre require
:
autoload
é principalmente para acelerar a fase de inicialização do seu programa Ruby ou aplicação Rails. Por não carregar os recursos até que sejam necessárias, isso pode acelerar as coisas um pouco.
Outra vantagem é que você pode não precisar carregar algumas partes do código, se o usuário não usar determinados recursos -. Melhorando assim o tempo de carga e reduzir a pegada de memória
Além de que outros já lhe disse, futuro da autoload
é incerto. Foi programado para ser preterido em Ruby 2.0, mas a reprovação não foi feito a tempo para o congelamento de recurso 2.0. Espera-se agora que autoload
será depreciado em Ruby 2.1, mas isso não é sequer certo mais .