読者です 読者をやめる 読者になる 読者になる

tech::hexagram

personal note for technical issue.

rubyのeach, mapの違い

すごく初歩的ですが、新年一発目のエントリは去年の積み残しから。

each

[20] pry(main)> def hoge
[20] pry(main)*   (1..10).to_a.each do |i|
[20] pry(main)*     unk = i + 1
[20] pry(main)*   end
[20] pry(main)* end
=> :hoge
[21] pry(main)> ihr = hoge
=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

http://ref.xaio.jp/ruby/classes/array/each

eachメソッドは、配列の要素の数だけブロックを繰り返し実行します。繰り返しごとにブロック引数には各要素が順に入ります。戻り値はレシーバ自身です。

レシーバ自身が返るので、いくら中で unk に代入したところで戻り値としては i が返り値になる。

map

[18] pry(main)> def huga
[18] pry(main)*   (1..10).to_a.map do |i|
[18] pry(main)*     unk = i + 1
[18] pry(main)*   end
[18] pry(main)* end
=> :huga
[19] pry(main)> ihr2 = huga
=> [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

http://ref.xaio.jp/ruby/classes/array/map

mapメソッドは、要素の数だけ繰り返しブロックを実行し、ブロックの戻り値を集めた配列を作成して返します。collectメソッドの別名です。

mapはeachとは違い、要素を使ってブロックを実行しブロックの戻り値を集めて返すようになっている。つまり中で定義した unk を集めた配列を作成して返すのでインクリメントされた配列が返り値になる。

今年もよろしくお願いいたします。