From: matz@... (Yukihiro Matsumoto) Date: 2002-03-10T00:03:21+09:00 Subject: [ruby-list:34270] Re: Enumerable#inject (Re: しぶらぐっ議事録。) まつもと ゆきひろです In message "[ruby-list:34266] Re: Enumerable#inject (Re: しぶらぐっ議事録。)" on 02/03/09, Koji Arai 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? まつもと ゆきひろ /:|)