Если вы считаете vanilla Ruby, «require» в основном используется в первых строках, потому что тогда вы уверены, что имеете доступ к тому, что вам нужно, и вам легче найти и прочитать, какую зависимость вам нужно.
Есть несколько случаев, когда вы хотите загрузить драгоценный камень только в методе, потому что это не очень важно для работы вашего скрипта (например, дополнительная визуализация).
С Rails я считаю, что это зависит от того, что вы хотите сделать.
Если вы используете Bundler, вы можете предположить, что ваш драгоценный камень был «обязательным» (вы можете, конечно, переопределить то, что требуется с параметром: require).
Если вы хотите автозагрузку при запуске сервера (например, валидаторы или сборщики форм), вам следует посмотреть, как это сделать с конфигурацией (autoload_paths и eager_load_paths).
require также может использоваться для загрузки только части драгоценного камня, например расширения для него. Тогда, конечно, требуется, где конфигурация.
Возможно, вас беспокоит работа в многопоточной среде, так как это некоторые проблемы с этим. Затем вы должны убедиться, что все загружено до запуска ваших потоков. (Кое-что вроде константы класса загружается, но методы еще нет, была хорошая статья, но я больше не могу ее найти).
Возможно, вы также захотите попробовать {Module, Kernel}.Автозагрузка, 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
, потому что это необходимо, только если вы ссылаетесь в теле класса на другую константу (все содержимое методов не разрешено, поэтому с этим нет никаких проблем).
Другим решением было бы определить эти константы в вашем основном файле, это также даст вам представление о структуре.
Спасибо тадман, это соответствует тому, о чем я думал. Вывод: читаемость важнее производительности, за исключением случаев, когда требуется использование тяжелых. – Cimm