ごとけんです 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