Когда использовать `require`, `load` или `autoload` в Ruby?

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

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

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

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


person Mark W    schedule 29.04.2009    source источник


Ответы (4)


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

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

person Brian Campbell    schedule 29.04.2009
comment
См. Ответ Бориса ниже, который содержит ссылку на более недавнее обсуждение автозагрузки. Он по-прежнему присутствует в версии 2.1: ruby-doc.org/ core-2.1.0/Module.html#method-i-autoload - person Andy Triggs; 11.02.2014
comment
Нет, это все еще часть Ruby 2.3.0: ruby-doc.org/core-2.3.0/Kernel.html#method-i-autoload, но согласно обсуждению этой ошибки (bugs.ruby-lang.org/issues/5653), вероятной целью будет Ruby 3.0. - person Raj; 19.04.2016
comment
ссылка на автозагрузку мертва - person ebrohman; 10.01.2017
comment
Так что нормально иметь «загрузку» для разработки и «требовать» для производства? С оператором if else? - person echan00; 16.12.2017
comment
@ echan00 нет, вы должны использовать require как для разработки, так и для производства. load следует использовать только в том случае, если вы пишете что-то особенное, например, собственный релоадер; но уже есть много хороших релоадеров, которые уже существуют для целей разработки. В Rails есть один, есть один для Sinatra и т. д. Если вы используете require в своем коде, перезагрузчики будут вести себя правильно. - person Brian Campbell; 20.12.2017
comment
По состоянию на февраль 2019 года Матц решил сохранить autoload (bugs.ruby-lang. org/issues/5653#note-46). - person Justin Ko; 26.03.2019

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>

Увидеть разницу.

person crazycrv    schedule 16.12.2011
comment
Задающий вопрос знает разницу между требованием и автозагрузкой, он спрашивал, когда вы должны использовать один, а не другой. - person Andrew Grimm; 17.12.2011
comment
Спасибо, Андрей, что указал. Ты прав. Как упоминалось пользователем 979339 выше, автозагрузку следует использовать там, где время имеет решающее значение, но вы все же хотите ускорить процесс. Например в серверах приложений вроде худ. Если вы посмотрите на исходный код тонкого кода, то обнаружите, что автор использовал автозагрузку вместо требования загрузки основных частей тонкого, таких как команда, соединение и ведение журнала, что ускоряет инициализацию тонкого. - person crazycrv; 29.12.2011
comment
Вы должны быть осторожны с библиотеками, которые не зарегистрированы в Ruby stdlib и rubygems, поэтому в качестве примера для локальной библиотеки требуется «./filename-no ext». Может быть, вы могли бы исправить это в своем коде, а затем удалить мой комментарий? Но спасибо за простой пример. А как же «нагрузка»? - person Douglas G. Allen; 25.09.2015

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

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

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

person Community    schedule 17.10.2011

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

person Boris Stitnicky    schedule 14.06.2013
comment
С тех пор эта ветка функций была закрыта с решением, что autoload не будет устареть. bugs.ruby-lang.org/issues/5653#note-46 - person chemturion; 17.11.2019