inject

inject

ri

 ------------------------------------------------------ Enumerable#inject
      enum.inject(initial) {| memo, obj | block }  => obj
      enum.inject          {| memo, obj | block }  => obj
 ------------------------------------------------------------------------
      Combines the elements of _enum_ by applying the block to an
      accumulator value (_memo_) and each element in turn. At each step,
      _memo_ is set to the value returned by the block. The first form
      lets you supply an initial value for _memo_. The second form uses
      the first element of the collection as a the initial value (and
      skips that element while iterating).
 
         # Sum some numbers
         (5..10).inject {|sum, n| sum   n }              #=> 45
         # Multiply some numbers
         (5..10).inject(1) {|product, n| product * n }   #=> 151200
      
         # find the longest word
         longest = %w{ cat sheep bear }.inject do |memo,word|
            memo.length > word.length ? memo : word
         end
         longest                                         #=> "sheep"
      
         # find the length of the longest word
         longest = %w{ cat sheep bear }.inject(0) do |memo,word|
            memo >= word.length ? memo : word.length
         end
         longest                                         #=> 5
 

refe

 Enumerable#inject
 --- inject([init]) {|result, item| ... }   ruby 1.7 feature
 
     最初に初期値 init と self の最初の要素を引数にブロック
     を実行します。2 回目以降のループでは、前のブロックの実行結果と 
     self の次の要素を引数に順次ブロックを実行します。そうして最
     後の要素まで繰り返し、最後のブロックの実行結果を返します。
 
     要素が空の場合は init を返します。
 
     初期値 init を省略した場合は、最初に先頭の要素と 2 番目の要
     素をブロックに渡します。この場合、要素が 1 つしかなければブロック
     を実行せずに最初の要素を返します。要素が空なら nil を返しま
     す。
 
     : 例
       合計の計算
         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