本文へスキップ
BecomeCoder

Rubyコース · 第6章 ブロックとイテレータ · レッスン27

reduce/injectで畳み込む

ブラウザで完結

導入

配列の全要素を合計したり、全要素を掛け合わせたり――「配列を1つの値にまとめる」処理は意外とよく登場します。そのための強力なメソッドが reduceinject という別名もあります)です。

説明

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(:+) と書いても同じ結果になります。

実際に動かしてみよう

下のエディタにRubyを書いて「実行」を押すと、学習用シミュレータが puts / print / p の出力を表示します(本物のRubyではなく、教材の範囲を再現した軽量な自作エンジンです)。配列・ハッシュ・ブロック(each/map/select)・メソッド・クラス・モジュール・例外なども動きます。本文の例を書き換えて動かしてみましょう(gem・Rails・ファイル入出力など一部の機能は対象外です。文字列を伸ばすときは str << も可能ですが、変数に反映されるのは str += です)。

Ruby — ブラウザ内で実行(学習用シミュレータ)

Rubyの教材サブセットを動かす学習用シミュレータを読み込みます(本物のRubyではなく、動きを再現した軽量な自作エンジンです)。
スクロールして表示された時点でも自動で読み込まれます。