From: Koji Arai Date: 2002-03-09T22:11:14+09:00 Subject: [ruby-list:34266] Re: Enumerable#inject (Re: しぶらぐっ議事録。) 新井です。 In message "[ruby-list:34265] Re: Enumerable#inject (Re:しぶらぐっ議事録。)" on 09 Mar 2002 21:43:53 +0900, rubikitch wrote: > From: Koji Arai > 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)