Когда нужно использовать `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, но это уже не так уж и есть.