けいじゅ@いしつかです. In [ruby-dev:40480] the message: "[ruby-dev:40480] Re: バグ? ブロック 引数で to_ary が呼ばれる必要のない場面で呼ばれる", on Feb/24 23:12(JST) Yukihiro Matsumoto writes: >まつもと ゆきひろです >|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で実行したかの情報 >も欲しかったなあ。今回はなんとなくわかったけど。 バージョンは最新版です. ruby 1.9.2dev(2010-02-24) 元のスクリプトの 75行目あたりでの処理 @c.d.each_export_by(@c.a, self) do |export, opts={}| を例外なく処理したいわけです. >で、ですね。この議論の後、この部分の挙動は > > * NoMethodErrorが発生し、 > * かつ、呼び出したオブジェクトが、元となったメソッドに > respond_to?しない 2番目が良くわからなかったのですが, この場合で言えば, 上記の式で export.respond_to?(:to_ary) がfalseになるってことです? >ときに捕捉するという風になってます。ですから、今回の to_ary >を定義するというやり方は、一番相性が悪かったわけですね。ので、 うーん. >class E > def method_missing(method, *args, &block) > if method == :to_ary > raise NoMethodError.new("to_ary", :to_ary) > end > end >end > >という風にするのはどうでしょうか。 たしかにその手もありますが, これだと, メソッド呼び出しの度に :to_aryの チェックが入るのでできれば避けたくて, to_aryのみの対応で済まないものか と... to_aryを定義しておいて, さらに, E#respond_to?を以下のように定義しても NGなんですが... class E def respond_to?(method) if method == :to_ary false else super end end end やっぱそういうものです? __ ---------------------------------------------------->> 石塚 圭樹 <<--- ---------------------------------->> e-mail: keiju / ishitsuka.com <<---