我有这段代码:
class A
def print
puts CONSTANT
end
end
module B
CONSTANT = "Don't Panic!"
end
假设a
是A类的实例。
所以我需要一个CONSTANT
的定义,应该能够找到a.print
。
我考虑将模块B
包含到a
的单例类中,如:
a.singleton_class.send :include, B
a.print # error: CONSTANT isn't found
我认为现在应该可以调用该方法但实际上没有。
应该成功导入常量,因为以下代码按预期工作:
a.singleton_class.constants # => [.., :CONSTANT, ..]
但是,通过将常量包含在类而不是单例类中,它可以工作:
a.class.send :include, B
a.print # prints: Don't Panic!
我觉得奇怪的是我不能引用在单例类中定义的常量。如果这是合理的,我想知道原因。
提前致谢。
答案 0 :(得分:2)
singleton_class
返回的类是一个匿名类,它继承自对象a
的类。
所以a.class
和a.singleton_class
引用了不同的对象。
puts a.class.object_id # => 79495930
puts a.singleton_class.object_id # => 79495830
还有不同的类:a.singleton_class
是A
的子类。
a.singleton_class.superclass # => A
a.singleton_class.ancestors # => [B, A, Object, Kernel, BasicObject]
a.class.ancestors # => [A, Object, Kernel, BasicObject]
正因为如此,a.singleton_class
不会像其他任何子类那样共享自己的常量。
puts a.class.constants # => []
puts a.singleton_class.constants # => [:CONSTANT]