どんな状況でもeach
でループ処理を書くことは可能だけど、
適したメソッドを使えば余分なコードを書かず本質的なコードのみにすることが出来る。
結論
・ループ処理の結果を配列で返して欲しい場合はmap
を使う
・ループ処理の結果をHashで返して欲しい場合はeach_with_object
を使う
・ループ処理の結果を集計したい場合はreduce
を使う
各要素に加算を行い配列を返したい場合を例にする。
eachの場合
result = []
numbers = [4, 3, 9]
numbers.each do |number|
result << number + 3
end
result
Array#map
ブロックの戻り値を集めた配列を返す。
numbers = [4, 3, 9]
numbers.map do |number|
number + 3
end
Enumerable#each_with_object
繰り返しごとにブロック引数numberには各要素を、resultには引数objectで指定したオブジェクトを入れる。
numbers = [4, 3, 9]
numbers.each_with_object([]) do |number, result|
result << number + 3
end
Enumerable#reduce
ブロックを使って繰り返し計算を行うのに使う。
numbers = [4, 3, 9]
numbers.reduce([]) do |result, number |
result << number + 3
result
end
各要素の集計を出したい場合にreduceを使うと、とてもシンプルに書くことが出来る。
eachの場合
result = 0
numbers = [4, 3, 9]
numbers.each do |number|
result = result + number
end
result
reduceの場合
numbers = [4, 3, 9]
puts numbers.inject(:+)