ブロックパラメータにおける配列と多値の違い

RUBY_VERSION                    # => "1.8.7"
[:a,:b].each_with_index {|x| # !> multiple values for a block parameter (2 for 1)
  x                             # => [:a, 0], [:b, 1]
}
def y1() yield 1, 2 end
y1 do |x| # !> multiple values for a block parameter (2 for 1)
  x                             # => [1, 2]
end
y1 do |x,|
  x                             # => 1
end
y1 do |*x|
  x                             # => [1, 2]
end
def y2() yield [1, 2] end
y2 do |x|
  x                             # => [1, 2]
end
y2 do |x,|
  x                             # => 1
end
y2 do |*x|
  x                             # => [[1, 2]]
end
RUBY_VERSION                    # => "1.9.0"
[:a,:b].each_with_index {|x|
  x                             # => :a, :b
}
def y1() yield 1, 2 end
y1 do |x|
  x                             # => 1
end
y1 do |x,|
  x                             # => 1
end
y1 do |*x|
  x                             # => [1, 2]
end
def y2() yield [1, 2] end
y2 do |x|
  x                             # => [1, 2]
end
y2 do |x,|
  x                             # => 1
end
y2 do |*x|
  x                             # => [[1, 2]]
end

Enumerable#each_with_indexでブロックパラメータひとつということはほぼ考えられないだろうからギャーという人はおらんかもしれん。

Ruby 1.9からはいかにも多値らしく振舞うようになったと思う。Ruby 1.8だとほとんど同じだから特に意識していなかった。はまらないようにこれからはブロックパラメータに配列を渡しているのか多値を渡しているのか意識しなくちゃ。

配列なり多値なり残りを捨てるには「,」を最後に付ければok。多値を配列として受けるには「*」を前置する。
id:yuguiさんによれば「ブロックパラメータはRuby 1.8は多重代入風味、Ruby 1.9だとメソッドの仮引数風味」とのことらしい。納得。