Я не знаю точно, почему Rails использует три разных метода загрузки (на самом деле два - см. Ниже). Но я вообще знаю, почему кто-то может.
Require
означает «загрузить это прямо сейчас». autoload
означает «загрузить это, когда вам нужно его использовать». Обычная причина использования обоих заключается в том, что у вас есть некоторые файлы, которые, как вы предполагаете, будут использоваться при каждом вызове программы; и другие, которые не являются обязательными. Например, в приложении Rails, которое не использует устаревшие методы, вам никогда не понадобится Deprecation
; так зачем замедлять начальную настройку, загружая этот файл?
В других случаях вы можете различать файлы, которые понадобятся на раннем этапе выполнения программы, и файлы, которые могут ждать. Например, вам вряд ли понадобится Gzip
до тех пор, пока не поступит первый запрос. Таким образом, с помощью автозагрузки вы можете на некоторое время отключить начальную настройку за счет небольшого замедления для первого запроса.
Вы можете спросить, ну почему бы просто не использовать autoload
для всего? Зачем загружать что-нибудь , прежде чем это будет абсолютно необходимо? Одна из причин заключается в том, что автозагрузка работает только для констант. Так, например, active_support/core_ext
добавляет кучу методов в Numeric, чтобы вы могли написать код, такой как 3.days
, 6.minutes
и 16.seconds.ago
. В 3.days
нет константы, поэтому вы не можете запустить автозагрузку для этого выражения. (И вы не можете автоматически загрузить Numeric
, потому что базовый класс уже загружен - это просто расширения, которые вы хотите добавить.)
Наконец, этот класс на самом деле не использует три метода загрузки; он использует два, и предоставляет один (своего рода). load_all!
используется Rails::Initializer
до
# Preload all frameworks specified by the Configuration#frameworks.
# Used by Passenger to ensure everything's loaded before forking and
# to avoid autoload race conditions in JRuby.
Я не знаю деталей, и я не знаю, почему эти конкретные модули предварительно загружены (а не остальные). Но так как это предназначено для поддержки определенных сред, вы можете понять, почему может потребоваться код, отдельный от механизма загрузки по умолчанию.