配列.reduce / inject
| 対応: | Ruby 1.8(2003) |
|---|
配列の要素を順に処理して1つの値にまとめるメソッドです。合計・積・最大値など集計処理に活用されます。畳み込みとは、配列の全要素を順番に処理して1つの値にまとめる操作です。
構文
# ブロックで畳み込み処理を行います(初期値なし)。
配列.reduce { |累積値, 要素| 処理 }
配列.inject { |累積値, 要素| 処理 } # reduce の別名
# 初期値を指定します。
配列.reduce(初期値) { |累積値, 要素| 処理 }
配列.inject(初期値) { |累積値, 要素| 処理 }
# シンボルで演算子を指定します(初期値省略可)。
配列.reduce(:演算子)
配列.reduce(初期値, :演算子)
メソッド一覧
| メソッド | 概要 |
|---|---|
| reduce { |acc, e| } | 左から順に累積値と各要素をブロックで処理し、最終的な累積値を返します。 |
| inject { |acc, e| } | 『reduce』の別名です。動作はまったく同じです。 |
| reduce(init) { |acc, e| } | 初期値を指定して畳み込みを開始します。空配列のときも初期値が返ります。 |
| reduce(:+) | シンボルで演算子を指定します。『reduce(:+)』は合計、『reduce(:*)』は積を求めます。 |
サンプルコード
sample_array_reduce_inject.rb
numbers = [1, 2, 3, 4, 5]
# 合計を求めます(初期値なし: 最初の要素が累積値の開始値)。
total = numbers.reduce { |acc, n| acc + n }
puts total # 15
# シンボル指定で簡潔に書けます。
puts numbers.reduce(:+) # 15
puts numbers.reduce(:*) # 120(積)
# 初期値を指定します。
total2 = numbers.reduce(100) { |acc, n| acc + n }
puts total2 # 115(100 + 1 + 2 + 3 + 4 + 5)
# inject も同じ動作です。
max_val = numbers.inject { |max, n| n > max ? n : max }
puts max_val # 5
# 文字列の結合にも使えます。
words = ["Ruby", "is", "fun"]
sentence = words.inject { |acc, w| "#{acc} #{w}" }
puts sentence # Ruby is fun
# ハッシュへの変換に応用できます。
pairs = [[:name, "岡部倫太郎"], [:age, 18]]
hash = pairs.reduce({}) { |h, (k, v)| h[k] = v; h }
puts hash.inspect # {:name=>"岡部倫太郎", :age=>18}
ruby array_reduce_inject.rb
15
15
120
115
5
Ruby is fun
{:name=>"岡部倫太郎", :age=>18}
概要
『reduce』(別名『inject』)は配列の畳み込み(fold)操作を行うメソッドです。ブロックの第1引数が累積値(accumulator)、第2引数が現在の要素です。ブロックの戻り値が次の累積値になります。
初期値を省略した場合、配列の最初の要素が累積値の開始値になります。空配列に対して初期値なしで呼び出すと『TypeError』が発生します。空配列の可能性がある場合は必ず初期値を指定してください。
単純な合計は『sum』メソッドの方が簡潔です。変換が必要な場合は『map』と組み合わせて使うか、『each_with_object』(初期値がオブジェクトのとき)を検討してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。