2016-05-18 51 views
-1

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

不应该红宝石创建不同的单类B和C?为什么B和C共享同一个匿名类?

回答

1

他们没有共享同一个单独的类。

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

但是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 
] 
+0

那么,类变量@@ a'属于哪个类? – griest

+0

@griest致'A'。 'A.class_variable_get(:@@ a)#=> 5'。 – sawa

+0

为什么'@@ a'被赋值给A而不是单例类? – griest

相关问题