Ruby 'require' ошибка: не удается загрузить такой файл



у меня есть один файл, главный.rb со следующим содержанием:



require "tokenizer.rb"


токенизатора.rb файл находится в тот же каталог и его содержание:



class Tokenizer
def self.tokenize(string)
return string.split(" ")
end
end


если я попытаюсь запустить main.РБ я получаю следующую ошибку:



C:Documents and Settingsmysrcfolder>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 все работает нормально. В чем тут может быть проблема?

1780   13  

13 ответов:

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

просто сделать это:

require_relative 'tokenizer'

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

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

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

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

используя require для доступа к файлам то, что находится на пути загрузки, - это прекрасная вещь, и рубиновые драгоценные камни делают это все время. Но вы не должны начинать аргумент с require С . если вы не делаете что-то очень особенное и не знаете, что вы делаете.

когда вы пишете код, который делает предположения о своей среде, вы должны тщательно подумать о том, какие предположения делать. В этом случае существует до трех различных способов требовать tokenizer файл, и каждый делает другой предположение:

  1. require_relative 'path/to/tokenizer': предполагается, что относительный путь между двумя исходными файлами Ruby останется прежним.
  2. require 'path/to/tokenizer': предполагается, что path/to/tokenizer находится внутри одного из каталогов на пути загрузки ($LOAD_PATH). Это обычно требует дополнительной настройки, так как вы должны добавить что-то в путь загрузки.
  3. require './path/to/tokenizer': предполагается, что относительный путь от текущего рабочего каталога процесса Ruby до tokenizer.rb останется тот же.

я думаю, что для большинства людей и большинства ситуаций предположения, сделанные в вариантах № 1 и № 2, с большей вероятностью верны с течением времени.

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

require_relative 'tokenizer'

нет необходимости суффикс его с .rb, поскольку Руби достаточно умна, чтобы знать, что вы имеете в виду в любом случае.

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

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

load './tokenizer.rb'

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

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

require_relative 'tokenizer'

Я надеюсь, что это помогает.

еще один хороший маленький метод-включить текущий каталог в свой путь загрузки с помощью

$:.unshift('.')

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

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

 require './tokenizer' 

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

require 'tokenizer'
require_relative 'tokenizer/main'

Это будет работать хорошо, если он находится в каталоге Gem lib, и это токенизатор.РБ

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

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

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

я использовал 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' 

Он работал нормально.

первый :

$ sudo gem install colored2

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

затем :

$ sudo gem update --system  

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

затем:

$  rvm -v
$ rvm get head

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

ObjC

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

Да

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

нет

вы хотели бы сделать вид тестирования? [ Да / Нет ]

нет

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

XMG

запуск pod install в вашей новой библиотеке.

для тех, кто абсолютно уверен, что их относительный путь правильный, моя проблема была в том, что мои файлы не имеют

Как насчет включения текущего каталога в путь поиска?

ruby -I. main.rb

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

Comments

    Ничего не найдено.