まつもと ゆきひろです

In message "[ruby-list:39216] Re: 特異メソッドでのクラス変数"
    on 04/02/18, "eclipse" <eclipse / neneko.com> writes:

|トップレベルでself.classするとObjectでしょうか?
|つまりクラス変数はレキシカルスコープってやつですか.

そういうことです。

|ところでトップレベルで@@clsVarを定義してみたとろNameErrorは消えたのですが,
|特異メソッドで参照している@@clsVarはトップレベルではないようです.
|完全にレキシカルってわけでもないようですが,なぜですか?

レキシカルなんですけど、気をつけないとサブクラスで更新されちゃ
うってことですね。使いにくいんでこの辺の仕様はRuby2で変更さ
れる予定です。

|@@clsVar = "toplevel class"
ここでObjectのクラス変数を宣言(値は"toplevel class")
|class Hoge
|  @@clsVar = "Hoge class"
ここでHogeはObejctのサブクラスなので@@clsVarの値の更新になる
|  def initialize
|   @insVar = "Hoge instance"
|  end
|  def methodA
|    p @insVar
|    p @@clsVar
|  end
|end
|hogeB = Hoge.new
|class << hogeB
|  def methodB
|    p @insVar
|    p @@clsVar # Hoge.@@clsVar
参照しているのはObjectのクラス変数(値は"Hoge class")
|  end
|end
|hogeB.methodB

ということになります。