ごとけんです

In message "[ruby-list:16357] Re: executable statements in class def"
    on 99/08/30, kikutani / sprintmail.com <kikutani / sprintmail.com> writes:

>すると new のときは class ... end が実行されるということですね。
>どうもnewのときはinitializeメソッドが実行される気がしていた。

ちょっと違うと思います。new はクラス Class のオブジェクトの
メソッドで、例えば class A ... end は Class のインスタンスを 
A という名前で作っているので、A というインスタンスのメソッド
としての new が呼ばれ、そして new の initialize が呼ばれるわ
けです。一方 class A ... end の直下に書かれたモノはAが定義さ
れるタイミングで実行されますが、A.new などは当然ですが定義の
タイミングでは実行されません。下のプログラムの出力が参考にな
るかも。

                 ### eval order
class C
  p 1            ### 1
  def initialize
    p 2          ### (from `C.new')
  end
end

p 3              ### 2
C.new            ### 3
p 4              ### 4

>うーむ、むずかしい。たしかにこれでできますが、@abc を $abc にしても
>OKだけど、単にabcじゃだめってのがよくわかりません。

ローカル変数は実行のたびに初期化されるから、じゃダメ??

>ここでの @abc はメソッドから参照できないけど、インスタンス変数
>なんでしょうか?

多少ややこしいんですが、@abcは、Aという名前のついたClassのイ
ンスタンスのインスタンス変数であって、クラスAのインスタンス
のインスタンス変数ではありません。Rubyではクラスもオブジェク
トですから。だから、例えば、こいつの素性は、

class A
  @abc = "ummm"

  class <<self
    def pr
      p @abc
    end
  end
end

A.pr #=> "ummm"

というようなモノになります。つまり A もインスタンスなので、
インスタンス変数には間違いないんです。

ところで、おそらく菊谷さんが意図されてるであろうモノは、クラ
スAのインスタンスのインスタンス変数みたいなのでやっぱり 
initialize の中で代入しないとダメです。

-- gotoken