Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Ruby辞典

  1. トップページ
  2. Ruby辞典
  3. 配列.reduce / inject

配列.reduce / inject

配列の要素を順に処理して1つの値にまとめるメソッドです。合計・積・最大値など集計処理に活用されます。

構文
# ブロックで畳み込み処理を行います(初期値なし)。
配列.reduce { |累積値, 要素| 処理 }
配列.inject { |累積値, 要素| 処理 }  # reduce の別名

# 初期値を指定します。
配列.reduce(初期値) { |累積値, 要素| 処理 }
配列.inject(初期値) { |累積値, 要素| 処理 }

# シンボルで演算子を指定します(初期値省略可)。
配列.reduce(:演算子)
配列.reduce(初期値, :演算子)
メソッド一覧
メソッド概要
reduce { |acc, e| }左から順に累積値と各要素をブロックで処理し、最終的な累積値を返します。
inject { |acc, e| }『reduce』の別名です。動作はまったく同じです。
reduce(init) { |acc, e| }初期値を指定して畳み込みを開始します。空配列のときも初期値が返ります。
reduce(:+)シンボルで演算子を指定します。『reduce(:+)』は合計、『reduce(:*)』は積を求めます。
サンプルコード
数値 = [1, 2, 3, 4, 5]

# 合計を求めます(初期値なし: 最初の要素が累積値の開始値)。
合計 = 数値.reduce { |acc, n| acc + n }
puts 合計  # 15

# シンボル指定で簡潔に書けます。
puts 数値.reduce(:+)  # 15
puts 数値.reduce(:*)  # 120(積)

# 初期値を指定します。
合計2 = 数値.reduce(100) { |acc, n| acc + n }
puts 合計2  # 115(100 + 1 + 2 + 3 + 4 + 5)

# inject も同じ動作です。
最大値 = 数値.inject { |max, n| n > max ? n : max }
puts 最大値  # 5

# 文字列の結合にも使えます。
単語 = ["Ruby", "is", "fun"]
文 = 単語.inject { |acc, w| "#{acc} #{w}" }
puts 文  # Ruby is fun

# ハッシュへの変換に応用できます。
キーと値 = [[:name, "Alice"], [:age, 30]]
ハッシュ = キーと値.reduce({}) { |h, (k, v)| h[k] = v; h }
puts ハッシュ.inspect  # {:name=>"Alice", :age=>30}
概要

『reduce』(別名『inject』)は配列の畳み込み(fold)操作を行うメソッドです。ブロックの第1引数が累積値(accumulator)、第2引数が現在の要素です。ブロックの戻り値が次の累積値になります。

初期値を省略した場合、配列の最初の要素が累積値の開始値になります。空配列に対して初期値なしで呼び出すと『TypeError』が発生します。空配列の可能性がある場合は必ず初期値を指定してください。

単純な合計は『sum』メソッドの方が簡潔です。変換が必要な場合は『map』と組み合わせて使うか、『each_with_object』(初期値がオブジェクトのとき)を検討してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。