2016-05-18 7 views
-1

Ich habe mit Singleton-Klassen in Ruby herumalbern und ich stieß auf etwas Verhalten, das ich nicht verstehe.Inherited Hook: Erstellen Sie verschiedene Singleton-Klasse für zwei verschiedene Unterklassen

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 

Sollte Ruby nicht eine andere Singleton-Klasse für B und C erstellen? Warum teilen sich B und C dieselbe anonyme Klasse?

Antwort

1

Sie teilen nicht die gleiche Singleton-Klasse.

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

Aber die Singleton-Klassen sind beide Unterklassen der Singletonklasse von 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 
] 
+0

Also zu welcher Klasse gehört die Klassenvariable '@@ a'? – griest

+0

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

+0

Warum wird '@@ a 'im Gegensatz zur Singleton-Klasse A zugewiesen? – griest

Verwandte Themen