2016-05-18 14 views
-1

私はRubyでシングルトンクラスを使いこなしていましたが、私は理解できません。継承されたフック:2つの異なるサブクラスに対して異なるシングルトンクラスを作成する

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> 

しかし、シングルトンクラスは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

したがって、クラス変数@ @ aはどのクラスに属していますか? – griest

+0

@griestに 'A'。 'A.class_variable_get(:@a)#=> 5'である。 – sawa

+0

なぜ@@ aはシングルトンクラスではなくAに割り当てられますか? – griest

関連する問題