2016-05-18 1 views
-1

J'ai joué avec des classes singleton dans Ruby et je suis tombé sur un comportement que je ne comprends pas.Crochet hérité: créer une classe singleton différente pour deux sous-classes différentes

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 

Ne devrait-il pas créer une classe singleton différente pour B et C? Pourquoi B et C partagent-ils la même classe anonyme?

Répondre

1

Ils ne partagent pas la même classe singleton.

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

Mais les classes singletons sont les deux sous-classes de la classe singleton de 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

Alors, à quelle classe appartient la variable de classe '@@ a'? – griest

+0

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

+0

Pourquoi '@@ a' est-il assigné à A par opposition à la classe singleton? – griest