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