なかだです。

At Tue, 24 Jun 2003 15:58:40 +0900,
> 1.8.0 preview3 で、次のスクリプトでの warning が2行目で
> 出ますが、4行目つまり、定義部分ではなく利用時に出るべき
> ではないでしょうか?
> 
> def foo
>   yield(1, 2)
> end
> foo do |x|
>   p x
> end
> 
> #-> test.rb:2: warning: multiple values for a block parameter (2 for 1)

どう出るのがいいでしょう。どこからyieldされてるかも分かったほう
がいいような気がするのですが。

とりあえず一案。

  $ ./ruby test.rb
  test.rb:4: warning: multiple values for a block parameter (2 for 1)
          from test.rb:2
  [1, 2]


Index: eval.c =================================================================== RCS file: /cvs/ruby/src/ruby/eval.c,v retrieving revision 1.468 diff -u -2 -p -r1.468 eval.c --- eval.c 23 Jun 2003 08:41:07 -0000 1.468 +++ eval.c 24 Jun 2003 07:29:22 -0000 @@ -4081,19 +4081,25 @@ rb_yield_0(val, self, klass, pcall, aval } else { + int len = 1; if (avalue) { - if (RARRAY(val)->len == 0) { - goto zero_arg; - } - if (RARRAY(val)->len == 1) { + len = RARRAY(val)->len; + if (len == 1) { val = RARRAY(val)->ptr[0]; } else { - rb_warn("multiple values for a block parameter (%d for 1)", RARRAY(val)->len); + goto mult_values; } } else if (val == Qundef) { - zero_arg: - rb_warn("multiple values for a block parameter (0 for 1)"); val = Qnil; + len = 0; + mult_values: + { + NODE *curr = ruby_current_node; + ruby_current_node = block->var; + rb_warn("multiple values for a block parameter (%d for 1)\n\tfrom %s:%d", + len, curr->nd_file, nd_line(curr)); + ruby_current_node = curr; + } } assign(self, block->var, val, pcall);
-- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦