Ошибка Ruby 'require': невозможно загрузить такой файл

У меня есть один файл 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, все работает нормально. В чем может быть проблема?

Ответ 1

Я просто попытался, и он работает с require "./tokenizer". Надеюсь, это поможет.

Ответ 2

Просто сделайте следующее:

require_relative 'tokenizer'

Если вы поместите это в файл Ruby, который находится в том же каталоге, что и tokenizer.rb, он отлично работает независимо от вашего текущего рабочего каталога (CWD).

Объяснение, почему это лучший способ

Другие ответы утверждают, что вы должны использовать require './tokenizer', но это неправильный ответ, потому что он будет работать, только если вы запустите свой Ruby-процесс в том же каталоге, в котором находится tokenizer.rb. Практически единственная причина для рассмотрения используя require, как это было бы, если вам нужно поддерживать Ruby 1.8, у которого нет require_relative.

Ответ на require './tokenizer' может работать для вас сегодня, но он излишне ограничивает способы запуска вашего Ruby-кода. Завтра, если вы хотите переместить файлы в другой каталог или просто хотите запустить свой Ruby-процесс из другого каталога, вам придется переосмыслить все эти инструкции require.

Использование require для доступа к файлам, находящимся на пути загрузки, является прекрасной вещью, и Ruby gems делают это все время. Но вы не должны начинать аргумент 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, с большей вероятностью сохраняются с течением времени.

Ответ 3

Ruby 1.9 удалил текущий каталог из пути загрузки, и поэтому вам нужно будет сделать относительный запрос на этот файл, как говорит Дэвид Грейсон:

require_relative 'tokenizer'

Нет необходимости суффиктировать его с помощью .rb, так как Ruby достаточно умный, чтобы знать, что вы имеете в виду.

Ответ 4

require загружает файл из $LOAD_PATH. Если вы хотите потребовать файл относительно текущего исполняемого файла вместо $LOAD_PATH, используйте require_relative.

Ответ 5

Я бы порекомендовал,

load './tokenizer.rb'

Учитывая, что вы знаете, что файл находится в том же рабочем каталоге.

Если вы пытаетесь потребовать его относительно файла, вы можете использовать

require_relative 'tokenizer'

Надеюсь, это поможет.

Ответ 6

Другим приятным небольшим методом является включение текущего каталога в путь загрузки с помощью

$:.unshift('.')

Вы можете нажать его на массив $: ($ LOAD_PATH), но unshift заставит его загрузить ваш текущий рабочий каталог до остальной части пути загрузки.

После того, как вы добавили текущий каталог в свой путь загрузки, вам не нужно указывать

 require './tokenizer' 

и можно просто вернуться к использованию

require 'tokenizer'

Ответ 7

require_relative 'tokenizer/main'

Это будет хорошо работать, если оно находится в каталоге gem lib, и это tokenizer.rb

Ответ 8

Проблема заключается в том, что require не загружается из текущего каталога. Это то, о чем я думал, но потом я нашел этот поток. Например, я попробовал следующий код:

irb> f = File.new('blabla.rb')
=> #<File:blabla.rb>
irb> f.read
=> "class Tokenizer\n    def self.tokenize(string)\n        return string.split(
\" \")\n    end\nend\n"
irb> require f
LoadError: cannot load such file -- blabla.rb
        from D:/dev/Ruby193/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `req
uire'
        from D:/dev/Ruby193/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `req
uire'
        from (irb):24
        from D:/dev/Ruby193/bin/irb:12:in `<main>'

Как видно, он читает файл в порядке, но я не мог его требовать (путь не был распознан). и здесь идет код, который работает:

irb f = File.new('D://blabla.rb')
=> #<File:D://blabla.rb>
irb f.read
=> "class Tokenizer\n    def self.tokenize(string)\n        return string.split(
\" \")\n    end\nend\n"
irb> require f
=> true

Как вы можете видеть, указали ли вы полный путь, файл загружается правильно.

Ответ 9

Я использовал jruby-1.7.4 для компиляции моего ruby-кода.

require 'roman-numerals.rb' 

- это код, который выдал ошибку ниже.

LoadError: no such file to load -- roman-numerals
  require at org/jruby/RubyKernel.java:1054
  require at /Users/amanoharan/.rvm/rubies/jruby-1.7.4/lib/ruby/shared/rubygems/custom_require.rb:36
   (root) at /Users/amanoharan/Documents/Aptana Studio 3 Workspace/RubyApplication/RubyApplication1/Ruby2.rb:2

Я удалил rb из require и дал

require 'roman-numerals' 

Все прошло отлично.

Ответ 10

Для тех, кто абсолютно уверен, что их относительный путь верен, моя проблема заключалась в том, что в моих файлах не было расширения ".rb"! (Хотя я использовал RubyMine для создания файлов и выбрал, что они были рубиновыми файлами при создании).

Дважды проверьте расширения файлов в проводнике!

Ответ 11

Сначала:

$ sudo gem install colored2

И вы должны ввести свой пароль

Тогда:

$ sudo gem update --system  

Появляются Обновление обновления rubygems ERROR: при выполнении gem... (OpenSSL:: SSL:: SSLError)   имя хоста "gems.ruby-china.org" не соответствует сертификату сервера

Тогда:

$  rvm -v
$ rvm get head

Последняя Какой язык вы хотите использовать? [Swift/ObjC]

ObjC

Вы хотите включить демонстрационное приложение в свою библиотеку? [Да/Нет]

Да

Какие рамки тестирования вы будете использовать? [Specta/Kiwi/None]

None

Вы хотите сделать проверку на основе просмотра? [Да/Нет]

Нет

Каков ваш префикс класса?

XMG

Запуск установки pod в новую библиотеку.

Ответ 12

вам нужно указать путь. По крайней мере, вы должны указать путь из текущего каталога. Это будет работать точно. ./filename