2016-05-18 10 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

相關問題