Rubyリファレンス: Home

inject (Enumerable)

Edit   History

標準クラス・モジュール > Enumerable > inject

enum.inject {|memo, item| block }
enum.inject(init) {|memo, item| block }

injectメソッドは、ブロックを使って繰り返し計算を行うのに使います。ブロックに順に「要素1、要素2」、「ブロックの前回の戻り値、要素3」、「ブロックの前回の戻り値、要素4」、...を渡します。メソッドの戻り値はブロックが最後に返した値になります。

引数initで初期値を指定すると、ブロックに「初期値、要素1」、「ブロックの前回の戻り値、要素2」、「ブロックの前回の戻り値、要素3」、...を渡します。

Ruby 1.8.7 Ruby 1.8.7と1.9では、injectメソッドの別名としてreduceメソッドが加わりました。

次の例は、配列の数値の合計を計算します。また、100から配列の数値を引いていった結果を計算します。

numbers = [4, 3, 9, 8, 5, 6, 1, 7, 2]
puts numbers.inject {|sum, n| sum + n }
puts numbers.inject(100) {|diff, n| diff - n }
45
55

次の例は、初期値を空の配列とし、ハッシュscoresから60以上の値を持つものを調べ、配列にキーを集めます。each_with_objectメソッドの例もご覧ください。

scores = { 'Carol' => 90, 'Alice' => 50, 'David' => 40, 'Bob' => 60 }
names = scores.inject([]) do |arr, (key, val)|
  arr << key if val >= 60
  arr
end
p names.sort
["Bob", "Carol"]
enum.inject(sym)
enum.inject(init, sym)

Ruby 1.8.7 Ruby 1.8.7と1.9では、injectメソッドにブロックの代わりにシンボルsymでメソッド名を渡すことができます。メソッド名を渡すと、「要素1.メソッド(要素2)」、「前回の結果.メソッド(要素3)」、...を計算していき、最後の結果を返します。

第1引数initに初期値を指定すると、「初期値.メソッド(要素1)」、「前回の結果.メソッド(要素2)」、...を計算していきます。

次の例は、配列の数値の合計を計算します。また、100から配列の数値を引いていった結果を計算します。

numbers = [4, 3, 9, 8, 5, 6, 1, 7, 2]
puts numbers.inject(:+)
puts numbers.inject(100, :-)
45
55

関連項目