【问题标题】:kernel_require.rb:54:in 'require' (LoadError) from book Well Grounded Rubyistkernel_require.rb:54:in 'require' (LoadError) from book Well Grounded Rubyist
【发布时间】: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

我认为 ruby​​gems 和两个 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.rbstacklike.rb 在同一个目录中吗?
  • @sagarpandya82 是的,两个文件都在同一个目录中
  • 所以,从 /usr/bin 中删除 rubygem
  • 你有没有机会在 irb 内部做这个?
  • 使用require_relative 'stacklike'

标签: ruby rubygems require


【解决方案1】:

这就是问题所在,您使用 require 而不是 require_relative 来了解差异,请参阅 this。记住这一点的最简单方法是教我 require 用于 gems 和库,require_relative 用于文件。

如果你不介意的话,我也对你的工作提出一些批评:

require_relative "stacklike"

class Stack
  include Stacklike #<= Initiate the module
end

STACK_INFO = Stack.new #<= Turn the non-descriptive 's' into a more descriptive constant STACK_INFO

def add_info #<= Create a method to add more information to the stack
  STACK_INFO.add_to_stack("item one")
  STACK_INFO.add_to_stack("item two")
  STACK_INFO.add_to_stack("item three")
end  

def objects_in_stack? #<= Create a method for the information that's inside of the stack
  puts "Objects currently on the stack: "
  puts STACK_INFO.stack
end

def taken? #<= Create a method for what's taken from the stack
  taken = STACK_INFO.take_from_stack
  puts "Removed this object: \e[31m#{taken}\e[0m" #<= Makes colored console output 
end

add_info
puts objects_in_stack?
puts taken?
puts objects_in_stack?

module Stacklike
  #<= Spaces are important in Ruby, mostly because it makes Ruby readable.
  def stack
    @stack ||= []
  end

  def add_to_stack(obj)
    stack.push(obj)
  end

  def take_from_stack
    stack.pop
  end

end

这是非常基本的,您可以将堆栈中的信息作为参数变量提供,也可以提示用户输入信息等。Ruby 的概念是 OOP,OOP 的概念正在建立一个系统,让一切都能成功地协同工作。这就是我对它的理解。我希望这能回答您的问题,然后再回答一些问题。


编辑

您也可以尝试安装最新版本的 ruby​​,如果您安装了 rvm,请执行 rvm install ruby 2.3.0。这将安装最新版本并允许您运行 Ruby。

【讨论】:

  • 会试试这个,显然使用 rvm 1.26.10
  • 好的,所以在rvm install ruby 2.3.0 之后,我得到了一个新的加载错误,看起来它从第 54 行更改为第 55 行。将在 OP 的编辑 3 中显示新错误。
  • @user1234 好消息是我们正在走得更远……哈哈
  • 海绵宝宝的声音 1永恒之后
  • @user1234 是的,我们可以成为朋友,继续尝试完全卸载 ruby​​。卸载后重新安装最新版本,再试一次,也可以试试require 'rubygems'require_relative '/full/path/to/the/file' 先做后面的事
猜你喜欢
  • 2015-01-15
  • 1970-01-01
  • 2017-07-09
  • 1970-01-01
  • 2015-03-25
  • 1970-01-01
  • 1970-01-01
  • 2014-03-16
  • 1970-01-01
相关资源
最近更新 更多