3

このコードブロックでは、

@@y = 1
class MyClass
 @@y = 2
end
p @@y # => 2

素朴に、それ@@yはトップレベルのスコープにあるようで、のスコープの@@yものと同じではありませんMyClass@@yクラスMyClass定義の影響を受けるのはなぜですか? (結果はなぜ2ですか?)

4

3 に答える 3

7

この例を見てみましょう。ここで@@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され、変更することができます。

于 2012-09-14T12:26:55.600 に答える
1

あなたがするとき

@@y = 1

オブジェクトで定義しています。MyClass は Object のサブクラスであるため、そのクラス変数にアクセスできます。

@@y = 1
class MyClass
  @@y = 2
end
p @@y
puts MyClass.superclass #=> Object
puts Object.class_variables #=> @@y
于 2012-09-14T12:31:38.993 に答える
-1

グローバル変数は次のようになります。

$y = 1

クラス変数は次のようになります。

@@y = 1

したがって、実際にはクラスvarsを使用しています

ここにリンクがあります:vars

于 2012-09-14T12:26:14.333 に答える