🗺️
eachとmapの違いをざっくり
違い
元のデータが処理されるかされないか
each
eachは、繰り返し処理が行いますが、元のデータは変わらずに戻ってきます。
array = [1, 2, 3]
array.each do |i|
i * 2
end
# 実行結果
# => [1, 2, 3]
put i * 2
や空配列resultを用意してresult << (i * 2)
などの処理をしないと2倍の計算結果が得られなず、array配列は元の値のまま戻ってきます。
map
mapは、繰り返し処理をした結果を、元の配列に更新して戻ってきます。
array = [1, 2, 3]
array.map do |i|
i * 2
end
# 実行結果
# => [2, 4, 6]
mapを使うと、計算された結果を配列で得ることができます。
少し応用例
例えば、studentsからnameを取得したい時、
# each メソッドの例
names = []
students.each do |student|
names << student.name
end
# map メソッドの例
names = students.map(&:name)
もしnames = students.each(&:name)
としてしまうと、each
メソッドが students
配列の name
メソッドを呼び出すだけで、結果を names
に追加する処理が行われません。このように、each
メソッドは単に各要素に対してブロックを実行するだけで、結果を収集しません。
一方、map(&:name)
は各 students
配列の name
メソッドを呼び出し、その結果を新しい配列として返します。この配列を names
に代入することで、期待通りの動作が得られます。
まとめ
mapの方が簡潔に書けて良さそうですが、やはり違いを理解して使い分けしていくのが良さそうです。
ちなみに、DBを使う時は、eachよりfind_eachの方がいいようです。
(参考:https://qiita.com/shingo-nakanishi/items/c4bd692e0f5efdb0a4c4)
Discussion