日時 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