Когда использовать в Ruby `require`,` load` или `autoload`? - PullRequest
58 голосов
/ 30 апреля 2009

Я понимаю тонкие различия между require, load и autoload в Ruby, но мой вопрос: как узнать, какой из них использовать?

Помимо возможности "обернуть" load в анонимном модуле, require представляется предпочтительным.

Но тогда autoload позволяет вам лениво загружать файлы - это звучит фантастически, но я практически не уверен, что вы получите по сравнению с require

Один метод предпочтительнее другого? Есть ли ситуация, когда один метод выделяется?

Ответы [ 4 ]

60 голосов
/ 30 апреля 2009

Как правило, вы должны использовать require. load будет перезагружать код каждый раз, поэтому, если вы сделаете это из нескольких модулей, вы будете выполнять много дополнительной работы. Ленивость autoload в теории звучит хорошо, но многие модули Ruby делают такие вещи, как «лопатка» других классов, что означает, что поведение несвязанных частей вашей программы может зависеть от того, использовался ли данный класс или нет. autoload находится в процессе устаревания , поэтому следует избегать его использования.

Если вы хотите создать свой собственный автоматический перегрузчик, который загружает ваш код каждый раз, когда он изменяется или каждый раз, когда кто-то нажимает на URL (в целях разработки, чтобы вам не приходилось перезагружать сервер каждый раз), тогда используйте load ибо это разумно.

17 голосов
/ 16 декабря 2011

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>

Смотрите разницу.

11 голосов
/ 17 октября 2011

вот что вы получаете с autoload над require:

autoload в первую очередь для ускорения фазы инициализации вашей программы Ruby или приложения Rails. Не загружая ресурсы до тех пор, пока они не понадобятся, это может немного ускорить процесс.

Еще одним преимуществом является то, что вам может не потребоваться загрузка некоторых частей кода, если пользователь не использует определенные функции - тем самым сокращается время загрузки и уменьшается объем используемой памяти.

7 голосов
/ 14 июня 2013

Помимо того, что другие уже сказали вам, будущее autoload неопределенно. В Ruby 2.0 планировалось отказаться от нее, но она не была сделана вовремя из-за зависания функции 2.0. Теперь ожидается, что autoload будет устаревшим в Ruby 2.1, , но это даже не является точным .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...