0

このコードでは:

class A
  @@a = 0
  def initialize
      @@a = @@a + 1
  end

  def to_s
    @@a
  end
end

a = A.new
p a
b = A.new
p b

def initialize ... end出力は 1 と 2 です。しかし、3 行目のandの@@a = @@a + 1直後を削除すると、出力は1@@a = 0と 1 になります。クラス変数がどのように処理されているかよくわかりません。initializeA.new@@a

メソッド内でラップし@@aていないのに、変数が自動インクリメントしないのはなぜですか? つまり、 、、 and => 1 => 0 + 1を呼び出した後、 を繰り返して 2 を取得するため、インクリメントするのは理にかなっています。これは何らかの理由で発生せず、その理由はわかりません.@@a = @@a + 1initializeA.new@@a = 0@@a = @@a + 1b = A.new

4

2 に答える 2

3

Ruby はファイルを上から下に実行しています。

機能のあるバージョンではinitialize、Ruby (大まかに言えば):

  1. クラス定義を入力します
  2. クラス変数 を定義し、@@aそれに 0 を代入します
  3. initialize関数と関数to_sを定義します
  4. A実行中および1initializeにインクリメントする新しい を作成します@@a
  5. A実行中および2initializeに増分する新しい を作成します@@a

@@a関数内にないバージョンの場合:

  1. クラス定義を入力します
  2. クラス変数 を定義し、@@aそれに 0 を代入します
  3. クラス変数@@aを 1 にインクリメントします
  4. to_s関数を定義します
  5. Aイニシャライザを実行しない新しい を作成します
  6. Aイニシャライザを実行しない新しい を作成します

Soは、Ruby がクラス定義のコードを実行するときに1 回@@aだけインクリメントされます。

于 2013-10-10T11:02:45.373 に答える
3

これは、クラスの本体のコードが一度実行されるためです-クラスがロードされるときです。したがって、@@aクラス変数は一度だけインクリメントします。

一方、initializeメソッド内のコードは、 を呼び出すたびに実行されますA.new

于 2013-10-10T11:00:24.470 に答える