導入
配列の全要素を合計したり、全要素を掛け合わせたり――「配列を1つの値にまとめる」処理は意外とよく登場します。そのための強力なメソッドが reduce(inject という別名もあります)です。
説明
numbers = [1, 2, 3, 4, 5]
total = numbers.reduce(0) { |sum, n| sum + n }
puts total
product = numbers.inject(1) { |acc, n| acc * n }
puts product
total2 = numbers.reduce(:+)
puts total2
reduce(初期値) { |累積値, 要素| ... } は、ブロックの結果を次の累積値として、配列の要素を1つずつ処理していきます。最後にブロックが返した値が reduce 全体の戻り値になります。
reduce(:+) のように演算子をシンボルで渡すと、「隣り合う2つの値を + で計算していく」という意味になり、{ |sum, n| sum + n } と同じ結果が短く書けます。
やってみよう
reduce(0) { |sum, n| sum + n } を reduce(:+) に書き換えて、同じ結果になることを確認しましょう。掛け算や最大値探しなど、別の畳み込みも試してみてください。
演習
配列 nums = [2, 4, 6, 8] の合計を reduce で計算し、puts で表示してください(20)。
ヒント1を見る
puts nums.reduce(0) { |sum, n| sum + n } のように書きます。
ヒント2を見る
nums.reduce(:+) と書いても同じ結果になります。