我一直在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
]