6

我试图在运行 irb 时包含一个源代码文件,但 irb 无法找到它。

例如,假设我在终端的以下目录中:

/dan/rubyapp/

假设我在 /dan/rubyapp/ 中有一个名为“firstapp.rb”的文件

我启动 irb 并从 irb 提示符输入

> require "firstapp.rb"

但找不到该文件。如果我输入“Dir.pwd”,它会显示为

/dan/rubyapp/

我可以让“要求”工作的唯一方法是如果我像这样包含完整路径

> require "/dan/rubyapp/firstapp.rb"

这是我能让它工作的唯一方法吗?我在网上看到的所有教程都只是“需要文件名”,所以我认为它会起作用。


这是 $: 在 irb 的输出

ruby-1.9.2-p0 > $:
 => ["/Users/Daniel/.rvm/gems/ruby-1.9.2-p0/gems/wirble-0.1.3/bin", 
"/Users/Daniel/.rvm/gems/ruby-1.9.2-p0/gems/wirble-0.1.3/lib", 
"/Users/Daniel/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/site_ruby/1.9.1", 
"/Users/Daniel/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/site_ruby/1.9.1/x86_64-darwin10.4.0", 
"/Users/Daniel/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/site_ruby", 
"/Users/Daniel/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/vendor_ruby/1.9.1", 
"/Users/Daniel/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/vendor_ruby/1.9.1/x86_64-darwin10.4.0", 
"/Users/Daniel/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/vendor_ruby", 
"/Users/Daniel/.rvm/rubies/ruby-1.9.2-p0/lib/ruby/1.9.1",     
"/Users/Daniel/.rvm/rubies/ruby-
1.9.2-p0/lib/ruby/1.9.1/x86_64-darwin10.4.0"] 
4

2 回答 2

8

问题是当前工作目录不再在您的路径中(从 Ruby 1.9.2 开始)。有几种不同的方法可以解决这个问题。

1) 在 ruby​​ 文件本身中,您可以使用方法 require_relative 而不是 require。这将加载一个相对于包含 require_relative 方法的文件的位置的文件:http: //extensions.rubyforge.org/rdoc/classes/Kernel.html

require_relative 'firstapp.rb'

但是,这在 irb 中不起作用。

2)您的另一个选择是将当前路径包含在 require 方法的参数中。这将在 irb 或 ruby​​ 文件中工作。例如:

require './firstapp.rb'

在 ruby​​ 中实现这一点的原因是为了避免在路径中的不同目录中存在同名的不同文件时无意中需要错误的文件(类似于 *nix 在其路径中不包含当前目录“.”的方式)

于 2011-01-18T21:54:48.890 回答
2

有几件事可以尝试:

1)从你的要求末尾删除 .rb ,这样你就有:

require 'firstapp'

您通常不会将 .rb 添加到 require 中(仅添加到负载中) - 在这里查看更多详细信息: http ://www.fromjavatoruby.com/2008/10/require-vs-load.html

2)如果失败,请确保当前目录在您的加载路径上 - 在 irb 中执行:

 p $:

它会打印出你的 ruby​​ 加载路径 - 检查“。”的条目。(我的是最后一个条目)

于 2010-09-21T10:43:40.610 回答