У меня есть один файл, main.rb со следующим содержимым:
require "tokenizer.rb"
Файл tokenizer.rb находится в том же каталоге, и его содержимое:
class Tokenizer
def self.tokenize(string)
return string.split(" ")
end
end
Если я пытаюсь запустить main.rb, я получаю следующую ошибку:
C:\Documents and Settings\my\src\folder>ruby main.rb
C:/Ruby193/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- tokenizer.rb (LoadError)
from C:/Ruby193/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require '
from main.rb:1:in `<main>'
Я просто заметил, что если я использую load
вместо того, чтобы require
все работает нормально. В чем может быть проблема здесь?
.rb
расширениеОтветы:
Я только что попробовал, и это работает с
require "./tokenizer"
. Надеюсь это поможет.источник
require_relative
как я сделал в своем ответе.Просто сделай это:
Если вы поместите это в Ruby-файл, который находится в том же каталоге, что
tokenizer.rb
и он, он будет работать нормально, независимо от того, какой у вас текущий рабочий каталог (CWD).Объяснение, почему это лучший способ
Другие ответы утверждают, что вы должны использовать
require './tokenizer'
, но это неправильный ответ, потому что он будет работать только в том случае, если вы запускаете свой процесс Ruby в том же каталоге, в котором онtokenizer.rb
находится. Практически единственная причина, поrequire
которой стоит подумать об этом, была бы, если вам нужно поддержка Ruby 1.8, которой нетrequire_relative
.require './tokenizer'
Ответ мог бы работать для вас сегодня, но это неоправданно ограничивает способы, которыми вы можете запустить свой код на Ruby. Завтра, если вы хотите переместить ваши файлы в другой каталог или просто хотите запустить процесс Ruby из другого каталога, вам придется переосмыслить все этиrequire
операторы.Использование
require
для доступа к файлам, находящимся на пути загрузки, - хорошая вещь, и гемы Ruby делают это постоянно. Но вы не должны начинать спорrequire
с,.
если вы не делаете что-то особенное и не знаете, что делаете.Когда вы пишете код, который делает предположения о его среде, вы должны тщательно продумать, какие предположения сделать. В этом случае существует до трех разных способов требовать
tokenizer
файл, и каждый делает разные предположения:require_relative 'path/to/tokenizer'
: Предполагается, что относительный путь между двумя исходными файлами Ruby останется прежним.require 'path/to/tokenizer'
: Предполагается, чтоpath/to/tokenizer
находится внутри одного из каталогов на пути загрузки ($LOAD_PATH
). Обычно это требует дополнительной настройки, так как вам нужно что-то добавить в путь загрузки.require './path/to/tokenizer'
: Предполагается, что относительный путь от текущего рабочего каталога к Ruby-процессуtokenizer.rb
останется прежним.Я думаю, что для большинства людей и большинства ситуаций предположения, сделанные в вариантах № 1 и № 2, с большей вероятностью сохранятся со временем.
источник
Ruby 1.9 удалил текущий каталог из пути загрузки, поэтому вам нужно будет выполнить относительные требования к этому файлу, как говорит Дэвид Грейсон:
Нет необходимости добавлять к нему суффиксы
.rb
, поскольку Руби достаточно умен, чтобы понять, что ты имеешь в виду.источник
Ruby 1.9 has removed the current directory from the load path
? Что это за текущий каталог и путь загрузки? Спасибо.require_relative
. Завтра он может напечатать,cd ..
а потомruby folder/main.rb
и опечалиться, ваше решение больше не работает. Я не думаю, что использование здесьrequire
имеет какую-либо выгоду.require_relative
(который не существовал, или я не знал об этом, на момент публикации)require
загружает файл из$LOAD_PATH
. Если вы хотите запросить файл относительно текущего исполняемого файла, а не из$LOAD_PATH
, используйтеrequire_relative
.источник
Я бы порекомендовал,
Учитывая, что вы знаете, файл находится в том же рабочем каталоге.
Если вы пытаетесь требовать его относительно файла, вы можете использовать
Надеюсь, это поможет.
источник
Еще один приятный маленький метод - включить текущий каталог в путь загрузки с помощью
Вы можете поместить его в массив $: ($ LOAD_PATH), но unshift заставит его загрузить ваш текущий рабочий каталог до остальной части пути загрузки.
После того, как вы добавили свой текущий каталог в путь загрузки, вам не нужно указывать
и может просто вернуться к использованию
источник
Это будет хорошо работать, если он находится в каталоге gem lib и это tokenizer.rb
источник
Я использовал jruby-1.7.4 для компиляции моего кода ruby.
это код, который выбросил приведенную ниже ошибку.
Я убрал рб из рук и дал
Работало нормально.
источник
Для тех, кто абсолютно уверен, что их относительный путь указан правильно, моя проблема заключалась в том, что мои файлы не имели
.rb
расширения! (Хотя я использовалRubyMine
для создания файлов и выбрал, что они былиRuby
файлами при создании.)Дважды проверьте расширения файла в вашем файле!
источник
Как насчет включения текущего каталога в путь поиска?
источник
Проблема в том, что
require
не загружается из текущего каталога. Я тоже так думал, но потом нашел эту ветку . Например, я попробовал следующий код:Как видно, он прочитал файл нормально, но я не смог его потребовать (путь не был распознан). и вот код, который работает:
Как вы видите, если указать полный путь, файл загружается правильно.
источник
Первый :
И вы должны ввести свой пароль
Затем :
Появляется Обновление rubygems-update ОШИБКА: При выполнении gem ... (OpenSSL :: SSL :: SSLError) имя хоста "gems.ruby-china.org" не соответствует сертификату сервера
Затем:
Последний Какой язык вы хотите использовать ?? [Swift / ObjC]
Вы хотите включить демонстрационное приложение в свою библиотеку? [ Да нет ]
Какие рамки тестирования вы будете использовать? [Спекта / Киви / Нет]
Вы хотите провести тестирование на основе просмотра? [ Да нет ]
Какой у тебя префикс класса?
Запуск pod установить в вашей новой библиотеке.
источник
вам нужно указать путь. По крайней мере, вы должны указать путь от текущего каталога. Это будет работать наверняка. ./имя файла
источник