2

我有这个代码:

class A
  def print
    puts CONSTANT
  end
end

module B
  CONSTANT = "Don't Panic!"
end

假设a是 A 类的一个实例。

所以我需要一个CONSTANT应该可以找到的定义a.print

我考虑将模块包含Ba的单例类中,例如:

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!

我认为我不能引用在单例类中定义的常量很奇怪。如果这是合理的,我想知道为什么。

提前致谢。

4

1 回答 1

2

返回的类singleton_class是一个匿名类,它继承自对象的类a

所以a.classa.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]
于 2012-07-31T00:36:38.777 回答