読者です 読者をやめる 読者になる 読者になる

「クラス自身のインスタンス変数」と「インスタンスのインスタンス変数」の違いが分からん

インスタンス変数を外部から参照できない - gan2 の Ruby 勉強日記を読んで、

class A
  attr_reader :var
  @var = "A"
end

a = A.new
puts a.var #=> nil


では nil が出力されて、

class A
  attr_reader :var
  def initialize
    @var = "A"
  end
end

a = A.new
puts a.var #=> A


では A が出力されるという例が紹介されていたんだけど、正直、理由がよく分からなかった。


自分では、gan2 さんが最初に疑問に思ったのと同じく、どちらとも A が出力されると思っていたんだけどな。


そこで、検索してみると Ruby の作者の まつもとゆきひろ さんがこれと恐らく同じ疑問に回答してくれている ruby-list を見つけた。以下にリンクを張っておく。


[ruby-list:2995] Re: access to instance variable


これによると、

class A
  attr_reader :var
  @var = "A"
end


とした場合の、@var は A クラスそのもののインスタンス変数になる。
しかし、実際に設定・参照したいのは A クラスのインスタンスインスタンス変数なので、これでは望むものが得られないのは当然ということらしい。


だから、このような場合は、オブジェクトが生成される時に呼び出されるメソッド initialize を使ってインスタンス変数の初期化を行えばよい。

class A
  attr_reader :var
  def initialize
    @var = "A"
  end
end


だけど、それだったら、クラスそのもののインスタンス変数にはどんな役割があるんだろう?Ruby の性質上、こういったものが定義できるのは自然なのかな?


このあたりの自分の理解がかなり曖昧なのでいまひとつ納得できない。