来自终端的Ruby设置

 % ruby -v
ruby 1.9.2p180 (2011-02-18 revision 30909) [i686-linux]
=> ~/ruby/grounded/test
 % where ruby
/home/mike/.rvm/rubies/ruby-1.9.2-p180/bin/ruby
/home/mike/.rvm/bin/ruby
/usr/local/bin/ruby
/usr/bin/ruby
=> ~/ruby/grounded/Person/test
 % which ruby
/home/mike/.rvm/rubies/ruby-1.9.2-p180/bin/ruby
% rvm current
ruby-1.9.2-p180

目录结构
 % tree
.
├── bowling.rb
└── bowling_spec.rb

文件内容
保龄球.rb
class Bowling

end

保龄球规范RB
require 'rubygems'
require 'rspec'
require 'bowling'
describe Bowling, "#score" do
  it "returns 0 for all gutter game" do
    bowling = Bowling.new
    20.times { bowling.hit(0) }
    bowling.score.should eq(0)
  end
end

%红宝石保龄球
/home/mike/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require': no such file to load -- bowling (LoadError)
    from /home/mike/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/site_ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
    from bowling_spec.rb:3:in `<main>'

问题
为什么当bowling.rbbowling_spec.rb时会出现加载错误
在同一个文件夹中?
在这个错误中,当我运行Ruby1.9.2时,到底是什么.../site_ruby/1.9.1/...呢,那为什么1.9.1还会出现呢?
我该如何克服这个困难,开始和鲁比一起玩。

最佳答案

当您require一个文件并且没有指定该文件的绝对路径时,ruby会查看它的加载路径(在ruby中访问为$LOAD_PATH$:),并检查每个目录中是否有您想要的文件。无法加载bowling.rb,因为它不在加载路径上的目录中。
解决方案是两件事之一:
将当前目录放在加载路径上:

$:.unshift File.expand_path('.')

这会将当前工作目录的完整路径放在加载路径上。
对文件的绝对路径使用require
require File.expand_path('../bowling', __FILE__)

一点附加信息:File.expand_path返回当前工作目录中第一个参数的绝对路径,除非给出第二个参数;然后它使用该路径作为起点所以整行可以读出来:
require /home/mike/src/something/bowling_spec.rb/../bowling

09-30 15:31
查看更多