このコードブロックでは、
@@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
ですか?)
この例を見てみましょう。ここで@@x
inBar
は確かに 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