单例类中的常量

时间:2012-07-30 21:19:32

标签: ruby singleton constants

我有这段代码:

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!

我觉得奇怪的是我不能引用在单例类中定义的常量。如果这是合理的,我想知道原因。

提前致谢。

1 个答案:

答案 0 :(得分:2)

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

所以a.classa.singleton_class引用了不同的对象。

puts a.class.object_id           # => 79495930
puts a.singleton_class.object_id # => 79495830

还有不同的类:a.singleton_classA的子类。

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]