1

シングルトンがどのように機能するかを理解しようとする実験を行いました。

クラス変数の前に @ ではなく @@ を付ける理由がわかりません。以下で参照されているように、変数がクラス定義とインラインで作成されている場合、self は Test として定義されており、変数はクラス変数ですよね? その後、シングルトン クラス定義で attr_accessor を使用してアクセスできます。初期化の @var は、初期化時に self がコンテキストで t に設定されているため、異なるように見えます。したがって、var はそのコンテキストで t に属しますか?

これはすべて非常に紛らわしいので、助けていただければ幸いです。

class Test
  @var = 99
  attr_accessor :var

  def initialize
    @var = "Whoop" #if this is commented, pri doesn't print anything.
  end

  def pri
    puts @var
  end

  class << self
    attr_accessor :var
  end
end

t = Test.new
puts Test.var # Outputs 99
Test.var = 5
puts Test.var # Outputs 5
puts t.pri # Outputs Whoop
4

1 に答える 1

3

変数がクラス定義とインラインで作成され、self が Test として定義され、変数がクラス変数である場合は正しいですか?

いいえ、クラスのインスタンス変数です。クラス変数ではありません。

インスタンス変数は、そのインスタンスにのみ表示されます。クラス変数は、クラス、他の祖先クラス、およびそれらのインスタンスに表示されます。

  • @var2 行目の defined は for Test(Classクラスのインスタンス) に定義されています。の祖先クラスにTestも、それらのインスタンスにも表示されません。
  • @@varTestは、その祖先クラスとそのインスタンスに対して定義されています。それらはすべて同じものを共有し@@varます。
  • @var行 6 で定義されている は、Test(それ自体ではありませんTest) の特定のインスタンスに対して定義されています。Testにも、 の他のインスタンスにも表示されませんTest
于 2013-05-28T06:36:10.923 に答える