我的主目录下的文件夹 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)
为什么?
答案 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
。
请注意,不包含文件的扩展名。