ブロックパラメータにおける配列と多値の違い
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だとメソッドの仮引数風味」とのことらしい。納得。