来自终端的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.rb
和bowling_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