kind=defined
names=inject,reduce
visibility=public

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

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

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

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

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

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

  # 合計を計算する
  p [1, 2, 3, 4, 5].inject(0) {|result, item| result + item }  # => 15

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

  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"


