Array#mapを調べた

ruby 1.9.3p0 (2011-10-30 revision 33570) [x86_64-darwin11.3.0]

eachと何が違うのかわからないし、mapって普段使わないのでちょっと調べてみた。

mapというのは、『(レシーバの)配列の"各要素"をブロックの中の最後の値に置き換える』と認識した。
配列のメソッドだけあって、各要素をブロック変数に書き出す動きはeachと同じ。
違うのはブロックの最後の値を取り出した要素に戻していること。
eachだと、各要素から取り出しっぱなし。(のはず。)

"!"が付くと破壊的メソッド。レシーバの中身を上書きする。

例1

arr = %w(age haaaoge foo poyo)
arr.map!{  | v |  v + "hoge" }
p arr 

結果

["agehoge", "haaaogehoge", "foohoge", "poyohoge"]

すごくわかりにくいし翌日には理解できないかもしれない。
わかりにくいところは代入していないのに"hoge"が付加されているところだと思う。見慣れない。

例2

ブロック変数を容易しているのにブロックの中は"hoge"だけ。

arr.map!{ |v|  "hoge" }
pp arr

結果

["hoge", "hoge", "hoge", "hoge"]

結果は"hoge"だけ。
mapは最後の値を配列に戻す。

例3

arr.map! do | v | 
 puts "nemui" 
 nil 
end
p arr 

結果

nemui
nemui
nemui
nemui
[nil, nil, nil, nil]

"nemui"文字列を出力しているけど、レシーバの値には変化なし。
mapは最後の値を配列に戻す。

以上。