我无法理解红宝石中的“未初始化的常数”

时间:2013-12-10 16:40:14

标签: ruby class

我的主目录下的文件夹 pc 中有两个文件。

第一档:

 class A
  class << self
   protected
    def foo
      puts "In foo"
     end
   end
 end

第二档:

  class B < A
   def bar
    self.class.class_eval { foo }
   end
  end

 B.new.bar

我的问题是当我运行第二个文件时出现以下错误:

  second.rb:1:in `<main>': uninitialized constant A (NameError)

为什么?

3 个答案:

答案 0 :(得分:2)

B.new.bar
# => In foo

在我的控制台中运行正常。我猜您可能忘记要求文件A中包含B的文件。

在档案B中使用

require 'a'

(假设包含A的文件名为a.rb)。

我阅读了各种评论,为了避免混淆,这里是两个文件的完整内容。

<强> class_a.rb

class A
  class << self
    protected
    def foo
      puts "In foo"
    end
  end
end

<强> class_b.rb

require_relative 'class_a'

class B < A
  def bar
   self.class.class_eval { foo }
  end
end

puts B.new.bar

以下是如何从控制台执行它们

$ ruby class_b.rb 
In foo

当然,您应该执行文件class_b.rb,而不是class_a.rb,否则您将看不到任何结果。

答案 1 :(得分:1)

这应该有效,假设它们都在同一个文件中。如果没有,您需要require第一个文件进入下一个文件:

# class_b.rb
require 'class_a.rb'

class B < A
  def bar
    self.class.class_eval { foo }
  end
end

B.new.bar
#=> "In foo"

<强>更新

为了要求该文件,您可能需要引用相对于当前目录的文件路径。例如,如果class_a.rb位于~/home且您正在运行irb(或class_b.rb位于~/home),那么您将class_a.rb包括require './class_a' 引用其相对路径如下:

{{1}}

答案 2 :(得分:1)

尝试require_relative 'class_a'require class_a

请注意,不包含文件的扩展名。