继承钩子:为两个不同的子类创建不同的单例类

时间:2016-05-18 00:03:49

标签: ruby singleton anonymous-class

我一直在搞乱Ruby中的单例类,我遇到了一些我不理解的行为。

class A
    def self.inherited(subclass)
        class << subclass
            @@a = 5
            def a
                @@a
            end
            def a=(value)
                @@a = value
            end
        end
    end 
end

class B < A
end

class C < A 
end

B.a    # => 5
C.a    # => 5
B.a= 7
C.a    # => 7

ruby​​不应该为B和C创建不同的单例类吗?为什么B和C共享同一个匿名类?

1 个答案:

答案 0 :(得分:1)

他们没有共享同一个单身人士类。

B.singleton_class
# => #<Class:B>
C.singleton_class
# => #<Class:C>

但是单例类都是A的单例类的子类。

B.singleton_class.ancestors
# => [
  #<Class:B>,
  #<Class:A>,
  #<Class:Object>,
  #<Class:BasicObject>,
  Class,
  Module,
  Object,
  Kernel,
  BasicObject
]
C.singleton_class.ancestors
# => [
  #<Class:C>,
  #<Class:A>,
  #<Class:Object>,
  #<Class:BasicObject>,
  Class,
  Module,
  Object,
  Kernel,
  BasicObject
]