Когда нужно использовать `require`,` load` или `autoload` в Ruby?
Я понимаю тонкие различия между require
, load
и autoload
в Ruby, но мой вопрос в том, как вы знаете, какой из них использовать?
Помимо возможности "обернуть" load
в анонимном модуле, require
представляется предпочтительным.
Но тогда autoload
позволяет вам ленивые файлы загрузки - это звучит фантастически, но я не уверен, что вы набираете больше require
Один метод предпочтительнее другого? Есть ли ситуация, когда выделяется один метод?
Ответы
Ответ 1
Как правило, вы должны использовать require
. load
будет перезагружать код каждый раз, поэтому, если вы сделаете это из нескольких модулей, вы будете делать много дополнительной работы. Ленивость autoload
звучит неплохо в теории, но многие модули Ruby делают такие вещи, как обезьяна-паттинг других классов, что означает, что поведение несвязанных частей вашей программы может зависеть от того, был ли данный класс еще использован или нет. autoload
также устарел, поэтому его следует избегать.
Если вы хотите создать свой собственный автоматический перезагрузчик, который загружает ваш код каждый раз, когда он изменяется, или каждый раз, когда кто-то нажимает на URL-адрес (для целей разработки, поэтому вам не нужно каждый раз перезапускать сервер), используя load
поскольку это разумно.
Ответ 2
mylibrary.rb
puts "I was loaded!"
class MyLibrary
end
Попробуйте в 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>
См. разницу.
Ответ 3
здесь, что вы получаете с помощью autoload
над require
:
autoload
предназначен в первую очередь для ускорения фазы инициализации вашей программы Ruby или Rails. Не загружая ресурсы до тех пор, пока они не понадобятся, это может немного ускорить работу.
Другим преимуществом является то, что вам может не понадобиться загружать некоторые части кода, если пользователь не использует определенные функции, тем самым улучшая время загрузки и уменьшая объем памяти.
Ответ 4
Помимо того, что вам уже сказали другие, будущее autoload
неопределенно. Он был устаревшим в Ruby 2.0, но устаревание не было сделано вовремя для замораживания функции 2.0. Ожидается, что autoload
будет устаревать в Ruby 2.1, но это уже не так уж и есть.