🗺️

eachとmapの違いをざっくり

2024/11/07に公開

違い

元のデータが処理されるかされないか

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