From: Yukihiro Matsumoto Date: 2009-11-27T22:32:50+09:00 Subject: [ruby-dev:39800] Re: バグ? ブロック引数で to_ary が呼ばれる必要のない場面で呼ばれる まつもと ゆきひろです In message "Re: [ruby-dev:39796] バグ? ブロック引数で to_ary が呼ばれる必要のない場面で呼ばれる" on Fri, 27 Nov 2009 18:52:44 +0900, keiju@ishitsuka.com (Keiju ISHITSUKA) writes: |Rubyのバグのようなバグではないようななんですが... | |ブロック引数にオプション引数を用いている場合で, 呼び出し側が: | | pre_bjob.each_export_by(input_filter, self) do |export, opts={}| | |で, 呼び出される側が: | | def each_export_by(njob, mapper, &block) |# block.call njob.export, :foo=>:bar | block.call njob.export | end | |となっているとき, njob.export に to_ary がないと怒られてしまいます. | |で, プログラム的にこの場面で to_ary が呼ばれる必要はないと思うのですが? |どうなんでしょう? 呼ばれる必要はないと思います。 |さらに, コメントのようにオプション引数にも実引数を渡すとこれは怒られな |くなります. | |ただ, 簡単な再現スクリプトを作ってもこの現象は再現しませんので, 何か特 |殊な条件が重なると発生するようです... うーん、直しようがない。 |一応, どのリビジョンからこの現象が起るのかは調べてあって, | | ruby 1.9.2dev (2009-10-29 trunk 25556) [i686-linux] | |からになります. ChangeLogを見ると | | * array.c (rb_ary_to_ary): do not use #respond_to? to detect | to_ary. Just call. [ruby-core:23738] | |こんなのがあって, 怪しいかなと思うのですが... これなんですけど、確かに直接呼ぶんですけど、rescueしてるはず です。ので、例外が発生するのはやっぱりおかしいです。大規模な プログラムで小規模な再現パターンを抽出できないと言うのは同情 しますが、それでもあまりに情報がないので対処しようがありませ ん。せめて「to_ary がないと怒られてしまう」ではなくて、どんな エラーメッセージなのか、できるだけ生のメッセージをいただくと かいうわけにはいきませんでしょうか。 あと、r25556だと、methog_missingが定義してあるかどうかで挙動 が変わります(定義されてないと例外処理をショートカットする)。 そのへんも織り込むと再現パターンを作れないでしょうか。