Ruby“ need”错误: 无法加载这样的文件

我有一个文件 main.rb,内容如下:

require "tokenizer.rb"

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

282003 次浏览

我刚试过,它与 require "./tokenizer"工程。希望这有所帮助。

Ruby 1.9已经从加载路径中移除了工作目录,所以你需要对这个文件做一个相对的要求,正如大卫格雷森所说:

require_relative 'tokenizer'

没有必要在后面加上 .rb,因为 Ruby 足够聪明,知道这就是你的意思。

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

正如您所看到的,如果您指定了文件正确加载的完整路径。

照我说的做:

require_relative 'tokenizer'

如果你把它放在一个和 tokenizer.rb在同一个目录的 Ruby 文件中,不管你当前的工作目录(CWD)是什么,它都能正常工作。

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

其他答案声称应该使用 require './tokenizer',但这是 错了的答案,因为它只有在与 tokenizer.rb相同的目录中运行 Ruby 进程时才能正常工作。考虑这样使用 require的唯一原因就是你需要支持 Ruby 1.8,它没有 require_relative

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

使用 require访问加载路径上的文件是一件好事,Ruby gems 一直都是这样做的。但是,除非你正在做一些非常特别的事情,并且知道自己在做什么,否则你不应该用 .开始 require的参数。

当您编写对其环境进行假设的代码时,应该仔细考虑要进行哪些假设。在这种情况下,有多达三种不同的方式需要 tokenizer文件,每种方式都有不同的假设:

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

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

我建议,

load './tokenizer.rb'

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

如果您试图要求它相对于文件,您可以使用

require_relative 'tokenizer'

希望这个能帮上忙。

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

另一个不错的小方法是在加载路径中包含工作目录

$:.unshift('.')

您可以将其推送到 $: ($LOAD _ PATH)数组,但 unshift 将强制它在加载路径的其余部分之前加载当前工作目录。

一旦在加载路径中添加了工作目录,就不需要继续指定了

 require './tokenizer'

然后就可以继续使用

require 'tokenizer'

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

require_relative 'tokenizer/main'

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

效果很好。

你需要给出路径。 至少你应该告诉我工作目录的路线肯定会有用的。 ./文件名

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

仔细检查文件的扩展名!

第一:

$ sudo gem install colored2

并且,您应该输入您的密码

然后:

$ sudo gem update --system

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

然后:

$  rvm -v
$ rvm get head

最后一个 你想使用什么语言

目的

是否要在库中包含演示应用程序? [是/否]

是的

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

没有

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

没有

你的类前缀是什么?

XMG

在新库上安装运行 pod。

在搜索路径中加入工作目录怎么样?

ruby -I. main.rb