【发布时间】:2016-11-01 08:11:48
【问题描述】:
我目前正在阅读 David Black 的“Well Grounded Rubyist”一书中的模块。在进行练习时,我在尝试运行以下代码时偶然发现了一个错误:
# stacklike.rb
module Stacklike
def stack
@stack ||= []
end
def add_to_stack(obj)
stack.push(obj)
end
def take_from_stack
stack.pop
end
end
# stack.rb
require "stacklike"
class Stack
include Stacklike
end
s = Stack.new
s.add_to_stack("item one")
s.add_to_stack("item two")
s.add_to_stack("item three")
puts "Objects currently on the stack: "
puts s.stack
taken = s.take_from_stack
puts "Removed this object: "
puts taken
puts "Now on stack: "
puts s.stack
当我运行程序时,$ ruby stack.rb,我收到以下错误:
/Users/myName/.rvm/rubies/ruby-2.2.0/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in 'require': cannot load such file -- stacklike (LoadError)
from /Users/myName/.rvm/rubies/ruby-2.2.0/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in 'require'
from stack.rb:2:in '<main>'
因此,在使用 stackoverflow 并遇到与该用户类似的问题(The #require method in modules mix-ins)之后,我尝试将:require "stacklike" 更改为require "./stacklike",但这没有用,所以我尝试了这些:
require_relative "stacklike"
require "***I put the absolute path to the file here***"
但没有成功。然后,我看这里:
no such file to load -- rubygems (LoadError),看来我有两个 ruby 版本...
我跑了:$ which -a ruby,得到以下输出:
/Users/myName/.rvm/rubies/ruby-2.2.0/bin/ruby
/usr/bin/ruby
我认为 rubygems 和两个 ruby 版本在使用“require”时会影响路径查找/加载位置。现在我想知道我是否必须删除一个版本,或者我是否都需要。我正在运行 OS X Yosemite (10.10.2),当我运行 ruby -v 时,我得到:ruby 2.2.0p0 (2014-12-25 revision 49005) [x86_64-darwin14]
我需要两个版本吗?如果我需要删除一个 ruby 版本,我应该删除哪一个以及如何删除?我尝试尽可能彻底,让我知道要提供哪些其他信息。
编辑1:是的,两个文件(stack.rb,stacklike.rb)都在同一个目录中
编辑 2:我尝试使用 require_relative “stacklike”,但它也不起作用。我还尝试从 usr/bin 中删除 gem 和 ruby,但也没有成功 - 我仍然遇到相同的加载错误。
编辑3:运行rvm install ruby 2.3.0后,运行ruby stack.rb时收到以下输出加载错误:
`/Users/myName/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- stacklike (LoadError)
from /Users/myName/.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require'
from stack.rb:2:in `<main>'`
我将 stack.rb 第 2 行更改为:require_relative 'stacklike'
编辑 4:
我跑了rvm implode 然后brew install ruby。现在我得到了同样的错误,但来自不同的路径 /usr/local/Cellar/ruby/2.3.1/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in require': cannot load such文件 -- stacklike (LoadError) 来自 /usr/local/Cellar/ruby/2.3.1/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in require' from stack.rb:2 :in'
(现在我错过了rvm,但至少which -a ruby 输出usr/local/bin/ruby)
编辑 5(最终编辑):我刚刚重新安装了 ruby,创建了一个新目录和文件,现在它以某种方式工作了......干杯并感谢大家的帮助!
【问题讨论】:
-
stack.rb和stacklike.rb在同一个目录中吗? -
@sagarpandya82 是的,两个文件都在同一个目录中
-
所以,从 /usr/bin 中删除
ruby和gem -
你有没有机会在 irb 内部做这个?
-
使用
require_relative 'stacklike'