日時 Mon, 30 Aug 1999 04:21:59 +0900 の
メール <199908291921.EAA20017 / hanare00.math.sci.hokudai.ac.jp> において
gotoken / math.sci.hokudai.ac.jp (GOTO Kentaro) さん曰く:

> 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は、Aという名前のついたClassのイ
> ンスタンスのインスタンス変数であって、クラスAのインスタンス
> のインスタンス変数ではありません。Rubyではクラスもオブジェク
> トですから。だから、例えば、こいつの素性は、
> 
> class A
>   @abc = "ummm"
> 
>   class <<self
>     def pr
>       p @abc
>     end
>   end
> end
> 
> A.pr #=> "ummm"
> 
> というようなモノになります。つまり A もインスタンスなので、
> インスタンス変数には間違いないんです。

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

もちろんそれはわかっております(^^)。

-- 
人生を背負い投げ

菊谷 誠(Kikutani Makoto)  kikutani / sprintmail.com