From: keiju@... (=?ISO-2022-JP?B?GyRCQFBETTc9PHkbKEI=?=) Date: 2009-11-28T14:24:29+09:00 Subject: [ruby-dev:39806] Re: バグ? ブロック引数で to_ary が呼ばれる必要のない場面で呼ばれる けいじゅ@いしつかです. In [ruby-dev:39805] the message: "[ruby-dev:39805] Re: バグ? ブロック 引数で to_ary が呼ばれる必要のない場面で呼ばれる", on Nov/28 09:09(JST) Yukihiro Matsumoto writes: >まつもと ゆきひろです >block.callに単一の引数が渡された時には、これが配列かどうか >チェックしてます。これは受け側がProcの時のめんどくさいいろい >ろがあって(後略)。 うーん. >わかりました。箇条書きにすると以下のような感じです。 > > * 型変換メソッドを呼び出して、NoMethodErrorが起きた時、 > name属性をチェックして、呼び出したメソッド以外で発生した > NoMethodErrorは飲み込まないようにしている。 条件(1) > * が、今回のプログラムはmethod_missing内部で直接 > NoMethodErrorをraiseしているので、このチェックに引っかか > らない(name属性が定義されていない) > > * ので、NoMethodErrorがrescueされなかった > >ということです。とりあえずの対処法としては、 > > * method_missingを再定義してNoMethodErrorをraiseする場合に > は、superを呼ぶ > >というのをお薦めしておきます。name属性を期待するコードは他に >もありそうですから。 こうすれば大丈夫でした. >それはそれとして、NoMethodErrorにname属性がないと言うことは、 >今回のようにユーザが自前でNoMethodErrorをraiseしたということ >を意味しますから、rescueするかどうかの基準を変更した方がよさ >そうです。 ただし, ブロック呼び出しの旅にto_aryが呼ばれるとなると, 分散オブジェク ト的には毎回通信が発生することになりますので, to_aryをリモート側が持っ ているかどうかのフラグを持たせて持っているときのみリモート側にto_aryを 送る様にしようかと思ったのですが... 前送ったスクリプトで, class E def to_ary raise NoMethodError, "to_ary" end end としてもだめなんですね... to_aryがdefしてあるんだけど存在しないことに したいときはどうすればよいでしょう? なんとなく, 条件(1)にマッチしてい るように見えるので, 大丈夫そうだったんですが?? あと, delegetor.rb も対処が必要そうな気がすると思って, 調べてみたらちゃ んとできていますね... で, delegator.rb のなかを見ると: target = self.__getobj__ unless target.respond_to?(m) super(m, *args, &block) else target.__send__(m, *args, &block) end となっていて, respond_to? がありますが, なぜこんなことやっているのでしょ う? これがらみ? __ ---------------------------------------------------->> 石塚 圭樹 <<--- ---------------------------------->> e-mail: keiju@ishitsuka.com <<---