From: matz@... (Yukihiro Matsumoto) Date: 1997-08-27T18:33:04+09:00 Subject: [ruby-dev:285] Re: [BUG] MLF まつもと ゆきひろです In message "[ruby-dev:284] Re: [BUG] MLF" on 97/08/27, 石塚圭樹 writes: |けいじゅ@日本ラショナルソフトウェアです. |>ここで定義したfailはException2MessageMapperの特異メソッドに |>なります. |> |> public :fail |> |>ここでpublicにするfailはObject#failです.ですから, | |え? 何でそうなるんですか? 良く理解できないんですが... なんでわかんないかな? Module#module_evalの中でのdefはそのモジュール(あるいはクラ ス)にメソッドを定義しますが,Object#instane_evalの中での defはそのオブジェクトの特異メソッドを定義します. ですから,module_evalを使った時とinstance_evalを使った時と ではdefによるメソッドの定義先が明らかに異なるわけですね. 一方,どちらでもselfはそのクラスですから,同じpublicメソッ ドが起動されます.Module#publicはそのモジュール(またはクラ ス)のメソッド(特異メソッドではない)をpublicにしますから, instance_evalを使った場合,(Exception2MessageMapperでは failが定義されていないので,クラス階層を遡って)Object#fail をpublicにします.module_evalを使った場合にはfailが Exception2MessageMapperで定義されていますから,そのメソッ ドをpublicにします. という説明でわかりますか? まつもと ゆきひろ /:|)