4 月 16 2008
[Ruby]Array#eachの変な挙動
結構Rubyに慣れて来たと思う。でも久々にRubyこえーと思った。
[1,2,3].each do | i |
printf "%s ", i
end
#=> 1 2 3
printf "%s ", i
end
#=> 1 2 3
これは問題ない。Array#eachのブロックが受け取る引数は配列の要素そのものだけ。
しかし恐ろしいことに、配列の要素がさらに配列で、ブロックの引数が2つ以上だと挙動が変わる。
[['a',1],['b',2]].each do | n,m |
printf "%s=>%d ",n,m
end
#=> a=>1 b=>2
printf "%s=>%d ",n,m
end
#=> a=>1 b=>2
ネストされた配列の要素を展開して引数に渡している・・・。この挙動はリファレンスに載っていない。
ちなみに引数を1つにすると
[['a',1],['b',2]].each do | n |
printf "%s ",n.class
end
#=> Array Array
printf "%s ",n.class
end
#=> Array Array
やっぱり要素をそのまま受け取る。
こえーーRubyこえーー。
参考: 天泣記#2008-08-16
[ruby-dev:29616] を実装したとき、最初は上のように括弧で括ればいいと考えて、配列の展開は行わなかった。 しかし、テストを通すために必要なところに括弧を挿入していったところ、最終的に rss でめげたのである。 多すぎてあきらめたのである。めげてしまい、また、配列の展開は使い勝手がいいということを認めざるを得なかったため、配列の展開は行うことにした。