Если вы рассматриваете ванильный Ruby, 'require' в основном используется в первых строках, потому что тогда вы уверены, что у вас есть доступ к тому, что вам нужно, и вам легче найти и прочитать то, что вам нужно.
Есть несколько случаев, когда вы хотите загрузить гем только в методе, потому что это на самом деле не нужно для работы вашего скрипта (например: дополнительная визуализация).
Я думаю, что с Rails это зависит от того, что вы хотите сделать.
Если вы используете Bundler, вы можете предположить, что ваш драгоценный камень «необходим» (вы, конечно, можете переопределить то, что требуется, с помощью опции: require).
Если вы хотите выполнить автозагрузку при запуске сервера (например, валидаторы или компоновщики форм), вам следует посмотреть, как это сделать с помощью config (autoload_paths и eager_load_paths).
require может также использоваться для загрузки только части драгоценного камня, например, расширения к нему. Тогда, конечно, требуется, где конфигурация.
Вас может беспокоить, если вы работаете в многопоточной среде, поскольку у них есть некоторые проблемы с этим. Затем вы должны убедиться, что все загружено, прежде чем запускать ваши потоки. (Что-то вроде константы класса загружено, но методов еще нет, была хорошая статья, но я больше не могу ее найти).
Возможно, вы также захотите попробовать {Module, Kernel} .autoload, Rails широко использует его для загрузки только того, что необходимо при доступе (но это выглядит довольно некрасиво).
Вы также можете взломать его самостоятельно с помощью const_missing (так что это может сделать простую ленивую загрузку, если вы принимаете структуру).
Это простой пример (не подходит для вложенных классов).
def Object.const_missing c
if (file = Dir["#{c.downcase}.rb"]).size == 1
require_relative(file)
end
if const_defined? c
const_get c
else
super # Object < Module
end
end
Что касается производительности, то запрос на запрос является относительно дорогим, поэтому, если вы знаете, что собираетесь его использовать, делайте это только один раз, если это возможно. Однако для управления сложными зависимостями в вашем проекте вам могут потребоваться относительные файлы. Тогда require_relative
- это путь в 1.9.
Наконец, для проекта я бы порекомендовал требовать все в главном файле в lib / с некоторым выражением Dir["**/*.rb"]
. Тогда вам редко понадобится require_relative
, потому что это необходимо, только если вы ссылаетесь в теле класса на другую константу (все содержимое методов не разрешено, поэтому с этим проблем нет).
Другим решением было бы определить эти константы в вашем основном файле, это также дало бы вам представление о структуре.