Ruby'需要'错误:无法加载这样的文件

我有一个文件,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一切正常。 这里可能有什么问题?

我只是试过,它require "./tokenizer" 。 希望这可以帮助。

只要这样做:

 require_relative 'tokenizer' 

如果你把它放在与tokenizer.rb位于同一目录的Ruby文件中,无论你当前的工作目录(CWD)是什么,它都可以正常工作。

解释为什么这是最好的方法

其他答案声称你应该使用require './tokenizer' ,但是这是错误的答案,因为它只有在你运行你的Ruby进程到tokenizer.rb所在的同一个目录时才有效。使用这样的require将是如果您需要支持Ruby 1.8,其中没有require_relative

require './tokenizer'答案今天可能适用于您,但是它不必要地限制了您可以运行Ruby代码的方式。 明天,如果你想把你的文件移动到不同的目录,或者只是想从一个不同的目录开始你的Ruby进程,你将不得不重新思考所有这些require语句。

使用require访问加载path上的文件是很好的事情,Ruby的gem一直在做。 但是,你不应该开始争论, require一个. 除非你正在做一些非常特别的事情,并且知道你在做什么。

当你编写对其环境进行假设的代码时,你应该仔细考虑要做出什么假设。 在这种情况下,有多达三种不同的方法来要求tokenizer文件,并且每个都做出不同的假设:

  1. require_relative 'path/to/tokenizer' :假设两个Ruby源文件之间的相对path将保持不变。
  2. $LOAD_PATH require 'path/to/tokenizer' :假设path/to/tokenizer位于加载path( $LOAD_PATH )中的一个目录中。 这通常需要额外的设置,因为您必须将某些内容添加到加载path。
  3. require './path/to/tokenizer' path/to/ tokenizer.rb require './path/to/tokenizer' :假定从Ruby进程的当前工作目录到tokenizer.rb的相对path将保持不变。

我认为,对于大多数人和大多数情况,选项#1和#2中的假设更可能随着时间的推移而成立。

Ruby 1.9已经从加载path中删除了当前目录,所以你需要在这个文件上做相对的要求,正如David Grayson所说:

 require_relative 'tokenizer' 

没有必要用.rb作为后缀,因为Ruby很聪明,无论如何也知道你的意思。

require$LOAD_PATH加载一个文件。 如果您想要相对于当前正在执行的文件而不是$LOAD_PATH ,请使用require_relative

我会build议,

 load './tokenizer.rb' 

鉴于,你知道该文件是在同一个工作目录。

如果你想要相对于文件,你可以使用

 require_relative 'tokenizer' 

我希望这有帮助。

另一个不错的方法是将当前目录包含在加载path中

 $:.unshift('.') 

你可以把它推到$:($ LOAD_PATH)数组上,但是unshift会迫使它在加载path的其余部分之前加载你当前的工作目录。

一旦你将你的当前目录添加到你的加载path中,你不需要继续指定

  require './tokenizer' 

并可以回到使用

 require 'tokenizer' 
 require_relative 'tokenizer/main' 

这将很好地工作,如果它在一个gem lib目录,这是tokenizer.rb

问题是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>' 

正如可以看到它读取文件好,但我不能要求它(path无法识别)。 这里是代码的作品:

 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 

正如你可以看到,如果你指定完整的path文件加载正确。

我用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 'roman-numerals' 

它工作正常。

对于那些绝对确定他们的相对path是正确的,我的问题是我的文件没有'.rb'扩展名! (即使我使用RubyMine来创build文件,并select它们是创build时的ruby文件)。

仔细检查资源pipe理器中的文件扩展名!

第一:

 $ sudo gem install colored2 

而且,你应该input你的密码

然后 :

 $ sudo gem update --system 

出现更新rubygems-update错误:执行gem时(OpenSSL :: SSL :: SSLError)主机名“gems.ruby-china.org”与服务器证书不匹配

然后:

 $ rvm -v $ rvm get head 

最后你想用什么语言? [Swift / ObjC]

ObjC

你想包括一个演示应用程序与您的图书馆? [是/否]

你会使用哪个testing框架? [Specta / Kiwi /无]

没有

你想做基于视图的testing吗? [是/否]

没有

什么是你的类前缀?

XMG

在新库上运行pod安装。

你需要给path。 至less你应该从当前目录中提供path。 这将工作肯定。 。/文件名