まつもと ゆきひろです

In message "[ruby-list:34266] Re: Enumerable#inject (Re: しぶらぐっ議事録。)"
    on 02/03/09, Koji Arai <JCA02266 / nifty.ne.jp> writes:

|module Enumerable
|  alias _orig_inject inject
|  def inject(init = nil, &prc)
|    if init.nil?
|      return nil if self.empty?
|      init = self.shift
|      self._orig_inject(init, &prc)
|    else
|      _orig_inject(init, &prc)
|    end
|  end
|end
|
|p [1,2,3,4,5].inject {|v,i| v + i}  # => 15
|
|そうか、定義しなおしてみてわかりました。each だけで定義でき
|なかったからダメだと思ったんでした。

そうなんですね。上記の定義だとempty?とかshiftとかを要求しちゃ
うのですよ。

|module Enumerable
|  alias _orig_inject inject
|  def inject(init = nil, &prc)
|    if init.nil?
|      v = nil
|      first = true
|      each {|i|
|	if first
|	  first = false
|	  v = i
|	  next
|	end
|	v = yield(v,i)
|      }
|      v
|    else
|      _orig_inject(init, &prc)
|    end
|  end
|end
|
|p [1,2,3,4,5].inject {|v,i| v + i}  # => 15
|
|こうかな?

たぶん、これだとinjectではないんでしょうね。なんていうんだっ
けなこういうの、間にオペレータを入れるようなやつ。reduce?

                                まつもと ゆきひろ /:|)