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



我一直在Ruby中摆弄singleton类,我遇到了一些我不理解的行为。

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创建一个不同的singleton类吗?为什么B和C共享同一个匿名类?

它们不共享同一个singleton类。

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

但是singleton类都是A的singleton类的子类。

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
]

最新更新