新井です。

In message "[ruby-list:34265] Re: Enumerable#inject (Re:しぶらぐっ議事録。)"
  on 09 Mar 2002 21:43:53 +0900,
  rubikitch <rubikitch / ruby-lang.org> wrote:
> From: Koji Arai <JCA02266 / nifty.ne.jp>
> Subject: [ruby-list:34264] Enumerable#inject (Re: しぶらぐっ議事録。)
> Date: Sat, 9 Mar 2002 21:33:16 +0900
> 
> るびきちです。
> 
> > inject って初期値(大抵 0 とか "" とか [] とかにしかならな
> > い・・・)を与えないと行けないのがちょっといやっ・・と言って
> > みるだけ。
> 数学的にいえば「零元」とか「単位元」がほとんどやね。

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 だけで定義でき
なかったからダメだと思ったんでした。

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

こうかな?

--
新井康司 (Koji Arai)