Ruby'require'错误:无法加载此类文件


169

我有一个文件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扩展名
onmyway133 '16

Answers:


189

我只是尝试了,它可以使用require "./tokenizer"。希望这可以帮助。


15
这假定CWD是,脚本存储在目录中。
大卫·格雷森

25
...这就是为什么我认为最require_relative好像我在回答中那样使用。
David Grayson

180

只是这样做:

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.除非您正在做非常特别的事情并且知道自己在做什么,否则您不应以a作为起点。

在编写对环境进行假设的代码时,应仔细考虑要进行的假设。在这种情况下,最多需要三种不同的方式来请求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中的假设随着时间的推移更可能成立。


你能告诉我这是什么意思吗?它在幕后做什么?谢谢。
sid Smith

没有太多要知道的。这是require_relative 的文档源代码
大卫·格雷森

90

Ruby 1.9已从加载路径中删除了当前目录,因此您需要对此文件进行相对要求,如David Grayson所说:

require_relative 'tokenizer'

无需在后面加上后缀.rb,因为Ruby足够聪明,可以知道那是您的意思。


1
我知道这将是一件愚蠢的事情,感谢您的帮助
编码僧侣2012年

3
这假定CWD是,脚本存储在目录中。
大卫·格雷森

@RyanBigg-我是红宝石新手。您能解释一下这是什么意思Ruby 1.9 has removed the current directory from the load path吗?当前目录和加载路径是什么?谢谢。
sid Smith,2014年

我应该在OP中阅读什么?仅仅因为OP恰好使CWD与脚本所在的目录相等,并不意味着总是那样,所以我想推动使用诸如的更强大的解决方案require_relative。明天他可能会打字cd ..,然后ruby folder/main.rb感到遗憾的是您的解决方案不再起作用。我认为使用require在这里没有任何好处。
David Grayson 2014年

1
已更新require_relative(在发布时不存在,或者我不知道)
Ryan Bigg 2014年

37

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



11

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

$:.unshift('.')

您可以将其压入$:($ LOAD_PATH)数组,但取消移位将强制其在加载路径的其余部分之前加载当前工作目录。

将当前目录添加到加载路径后,无需继续指定

 require './tokenizer' 

可以回去使用

require 'tokenizer'

5

如果它位于gem lib目录中,并且这是tokenizer.rb,它将很好地工作。

require_relative 'tokenizer/main'

1

我使用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' 

工作正常。


1

对于那些绝对确定其相对路径正确的人,我的问题是我的文件没有.rb扩展名!(即使我曾经RubyMine创建文件并选择它们是创建时的文件Ruby。)

仔细检查文件中的文件扩展名!



0

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

如您所见,如果您指定了完整路径,则文件将正确加载。


1
这是一个选择问题。我个人总是喜欢测试我在交互式控制台中所做的事情。我犯了很多错误,而且我喜欢获得交互式反馈。
鲍里斯·斯特兰德耶夫

0

首先:

$ sudo gem install colored2

并且,您应该输入密码

然后 :

$ sudo gem update --system  

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

然后:

$  rvm -v
$ rvm get head

最后您要使用哪种语言?[Swift / ObjC]

对象

您想在您的库中包含一个演示应用程序吗?[是/否]

您将使用哪些测试框架?[Specta / Kiwi / None]

没有

您想进行基于视图的测试吗?[是/否]

没有

你的班级前缀是什么?

XMG

在新库上运行pod安装。


-2

您需要给出路径。至少,您应提供当前目录的路径。它肯定会工作。。/文档名称


为了清楚起见,我认为您应该在此处给出带有修复的重复代码部分。向下的票是不是我的
罗特·古普塔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.