names=inject,reduce
visibility=public
kind=defined

--- inject(init = self.first) {|result, item| ... } -> object
--- inject(sym)                                     -> object
--- inject(init, sym)                               -> object
--- reduce(init = self.first) {|result, item| ... } -> object
--- reduce(sym)                                     -> object
--- reduce(init, sym)                               -> object

リストのたたみこみ演算を行います。

最初に初期値 init と self の最初の要素を引数にブロックを実行します。
2 回目以降のループでは、前のブロックの実行結果と
self の次の要素を引数に順次ブロックを実行します。
そうして最後の要素まで繰り返し、最後のブロックの実行結果を返します。

要素が存在しない場合は init を返します。

初期値 init を省略した場合は、
最初に先頭の要素と 2 番目の要素をブロックに渡します。
また要素が 1 つしかなければブロックを実行せずに最初の要素を返します。
要素がなければブロックを実行せずに nil を返します。

@param init  最初の result の値です。任意のオブジェクトが渡せます。
@param sym   ブロックの代わりに使われるメソッド名を表す [[c:Symbol]] オブジェクトを指定します。
             実行結果に対して sym という名前のメソッドが呼ばれます。             
例:

  # 合計を計算する。
  p [2, 3, 4, 5].inject {|result, item| result + item }        #=> 14
 
  # 自乗和を計算する。初期値をセットする必要がある。
  p [2, 3, 4, 5].inject(0) {|result, item| result + item**2 }  #=> 54

この式は以下のように書いても同じ結果が得られます。

  result = 0
  [1, 2, 3, 4, 5].each {|v| result += v }
  p result   # => 15

  p [1, 2, 3, 4, 5].inject(:+)                    #=> 15
  p ["b", "c", "d"].inject("abbccddde", :squeeze) #=> "abcde"


