From: Yukihiro Matsumoto Date: 2010-02-24T23:12:41+09:00 Subject: [ruby-dev:40480] Re: バグ? ブロック引数で to_ary が呼ばれる必要のない場面で呼ばれる まつもと ゆきひろです In message "Re: [ruby-dev:40479] Re: バグ? ブロック引数で to_ary が呼ばれる必要のない場面で呼ばれる" on Wed, 24 Feb 2010 18:43:30 +0900, keiju@ishitsuka.com (石塚圭樹) writes: |>お願いですから、単に「うまく行かない」ではなく、どのようなプ |>ログラムを動かして、どのような振る舞いを期待したが、どのよう |>な結果になったかを教えてください。特に今回のように時間が開い |>た時には。とりあえず[ruby-dev:39803]のスクリプトは、コメント |>をつけてもはずしても、どちらも例外が起きないようです。 | |舌足らずで申し訳ないです. [ruby-dev:39803]のスクリプトで, class E を下 |記のように書き換えました. | |class E |# def method_missing(method, *args, &block) |# raise NoMethodError, "to_ary" |# end | | def to_ary | raise NoMethodError.new("to_ary", :to_ary) | end |end | |下記の理由で, to_aryは定義されているが, 存在しないように見せかけたいた |めです. このように書き換えたんですね。ありがとうございます。それは良 いのですが、すると何が起きることを期待していて、実際はどうなっ たかについて、それからどのバージョンのRubyで実行したかの情報 も欲しかったなあ。今回はなんとなくわかったけど。 で、ですね。この議論の後、この部分の挙動は * NoMethodErrorが発生し、 * かつ、呼び出したオブジェクトが、元となったメソッドに respond_to?しない ときに捕捉するという風になってます。ですから、今回の to_ary を定義するというやり方は、一番相性が悪かったわけですね。ので、 class E def method_missing(method, *args, &block) if method == :to_ary raise NoMethodError.new("to_ary", :to_ary) end end end という風にするのはどうでしょうか。 まつもと ゆきひろ /:|)