このコードブロックでは、
@@y = 1
class MyClass
@@y = 2
end
p @@y # => 2
素朴に、それ@@yはトップレベルのスコープにあるようで、のスコープの@@yものと同じではありませんMyClass。@@yクラスMyClass定義の影響を受けるのはなぜですか? (結果はなぜ2ですか?)
このコードブロックでは、
@@y = 1
class MyClass
@@y = 2
end
p @@y # => 2
素朴に、それ@@yはトップレベルのスコープにあるようで、のスコープの@@yものと同じではありませんMyClass。@@yクラスMyClass定義の影響を受けるのはなぜですか? (結果はなぜ2ですか?)
この例を見てみましょう。ここで@@xinBarは確かに in とは別のもの@@xですFoo。
class Foo
@@x = 1
end
class Bar
@@x = 2
end
Foo.class_variable_get(:@@x) # => 1
Bar.class_variable_get(:@@x) # => 2
しかし、Barが の子の場合はどうなりFooますか?
class Foo
@@x = 1
end
class Bar < Foo
@@x = 2
end
Foo.class_variable_get(:@@x) # => 2
Bar.class_variable_get(:@@x) # => 2
この場合、@@xはどちらの場合も同じで、 で宣言されているものFooです。
さて、あなたの例に戻ります:
@@y = 1
class MyClass
@@y = 2
end
p @@y
最初の行は、ルート スコープでクラス変数を宣言します。mainルートは、タイプの特別なオブジェクトObjectです。したがって、本質的に、クラスでクラス変数を定義していますObject。すべてが であるためObject、このように の定義MyClassも継承@@yされ、変更することができます。
あなたがするとき
@@y = 1
オブジェクトで定義しています。MyClass は Object のサブクラスであるため、そのクラス変数にアクセスできます。
@@y = 1
class MyClass
@@y = 2
end
p @@y
puts MyClass.superclass #=> Object
puts Object.class_variables #=> @@y