Ruby

[Ruby]効率的なループ処理

どんな状況でも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(:+)