7 ответов:
просто посмотри docs:
require_relativeдополняет встроенный методrequireпозволяя вам загружать файл, который относится к файлу, содержащемуrequire_relativeзаявление.например, если у вас есть классы модульных тестов в каталоге " test "и данные для них в каталоге" test/data", то вы можете использовать такую строку в тестовом случае:
require_relative "data/customer_data_1"
require_relativeявляется удобным подмножествомrequirerequire_relative('path')равен:
require(File.expand_path('path', File.dirname(__FILE__)))если
__FILE__определяется, или он поднимаетLoadErrorв противном случае.это означает, что:
require_relative 'a'иrequire_relative './a'требуются относительно текущего файла (__FILE__).это то, что вы хотите использовать, когда требуется внутри вашей библиотеки, так как вы не хотите, чтобы результат зависел от текущий каталог вызывающего абонента.
eval('require_relative("a.rb")')поднимаетLoadError, потому что__FILE__не определяется внутриeval.вот почему вы не можете использовать
require_relativeв тестах RSpec, которые получаютevaled.следующие операции возможны только с
require:
require './a.rb'требуется относительно текущей директории
require 'a.rb'использует путь поиска ($LOAD_PATH) требовать. Он не находит файлы относительно текущего каталога или пути.это невозможно с
require_relativeпотому что документы говорят, что поиск пути происходит только тогда, когда" имя файла не разрешается в абсолютный путь " (т. е. начинается с/или./или../), что всегда имеет место дляFile.expand_path.следующая операция возможна с обоими, но вы хотите использовать
requireкак это короче и более эффективно:
require '/a.rb'иrequire_relative '/a.rb'оба требуют абсолютного пути.Читать источник
когда документы не ясны, я рекомендую вам взглянуть на источники (переключить источник в документах). В некоторых случаях это помогает понять, что происходит.
требуется:
VALUE rb_f_require(VALUE obj, VALUE fname) { return rb_require_safe(fname, rb_safe_level()); }require_relative:
VALUE rb_f_require_relative(VALUE obj, VALUE fname) { VALUE base = rb_current_realfilepath(); if (NIL_P(base)) { rb_loaderror("cannot infer basepath"); } base = rb_file_dirname(base); return rb_require_safe(rb_file_absolute_path(fname, base), rb_safe_level()); }это позволяет нам сделать вывод это
require_relative('path')- это то же, что:
require(File.expand_path('path', File.dirname(__FILE__)))потому что:
rb_file_absolute_path =~ File.expand_path rb_file_dirname1 =~ File.dirname rb_current_realfilepath =~ __FILE__
от Ruby API:
require_relative дополняет встроенный метод требует, позволяя вам чтобы загрузить файл, который находится относительно файл, содержащий require_relative заявление.
при использовании require для загрузки файла, вы обычно получаете доступ функциональность, которая была правильно установлен и доступен, в ваша система. требовать не предлагает а хорошее решение для загрузки файлов внутри проект код. Это может быть полезно на этапе разработки, например доступ к тестовым данным, или даже для доступ к файлам, которые "заблокированы" внутри проекта, не предназначенного для наружное использование.
например, если у вас есть модульный тест классы в каталоге "test", а также данные для них под тестом каталог" test/data", тогда вы можете используйте такую строку в тестовом примере:
require_relative "data/customer_data_1"Так как ни один "тест "или" тест/данные", скорее всего, будут в библиотеке Руби путь (и для хорошая причина), нормальный требовать не будет найти их. require_relative хороший решение именно этой проблемы.
вы можете включить или отключить расширение (.rb или. so) из файла, которым вы являетесь погрузка.
путь должен отвечать на to_str.
вы можете найти документацию по адресу http://extensions.rubyforge.org/rdoc/classes/Kernel.html
резюме
использовать
requireдля установки драгоценных камнейиспользовать
require_relativeдля локальных файлов
requireиспользует$LOAD_PATHнайти файлы.
Это, как требует, например,
require 'date'работа - они полагаются на вас установив (например
gem install [package]) пакет где-то в системе для этой функциональности.при использовании
requireвы можете используйте "./" формат файла в текущий каталог, например,require "./my_file"но это не общепринятая и рекомендуемая практика, и вы должны использоватьrequire_relativeвместо.при использовании
require_relative, Я рекомендую, чтобы файлы были "внутри" текущего дерева каталогов, а не "вверх", например не использоватьrequire_relative '../../../filename'(до 3 уровней каталогов) в файловой системе, потому что это имеет тенденцию создавать ненужные и хрупкие зависимости.
отметим, что
require_relativeиспользует текущий каталог файла с require_relative заявление (так что не обязательно ваш текущий каталог).
лучшие ответы правильные, но глубоко технические. Для тех, кто новее Рубина--
require_relativeскорее всего, будет использоваться для ввода кода из другого файла, который вы написали.например, что если у вас есть данные в
~/my-project/data.rbи вы хотите включить, что в~/my-project/solution.rb? вsolution.rbдобавитьrequire_relative 'data'.важно отметить, что эти файлы не должны быть в одном каталоге.
require_relative '../../folder1/folder2/data'тоже действительный.
requireскорее всего, будет использоваться для ввода кода из библиотеки, которую написал кто-то другой.например, что делать, если вы хотите использовать одну из вспомогательных функций, предусмотренных в
active_supportбиблиотеки? вам нужно будет установить драгоценный камень сgem install activesupportа потом в файлеrequire 'active_support'.require 'active_support/all' "FooBar".underscore
сказал по-другому--
require_relativeтребуется файл, специально указанный относительно файла, который называть это.
requireтребуется файл, включенный в $ LOAD_PATH.
Я только что видел, что код RSpec имеет некоторые комментарии
require_relativeбудучи O (1) константа иrequireбудучи O (N) линейным. Так что, вероятно, разница в том, чтоrequire_relativeявляется предпочтительным, чемrequire.
хочу добавить, что при использовании Windows, вы можете использовать
require './1.rb'Если скрипт выполняется локально или с подключенного сетевого диска, но при запуске из UNC \servername\sharename \ путь к папке необходимо использоватьrequire_relative './1.rb'Я не вмешиваюсь в дискуссию, которую следует использовать по другим причинам.
Comments