From: Levin Alexander Date: 2006-02-04T01:09:26+09:00 Subject: Re: Allow additional parameters to Enumerable#inject On 2/3/06, Robert Klemme wrote:> > I think that inject_with_state could be made fully backwards> > compatible to inject, it would be nice if inject could be changed to> > support this. What do you think?>> You don't need to redefine Enumerable#inject for this.>> >> def count_streams(enum)> >> enum.inject([[],nil]) {|(a, last),e| Thanks, I was not aware that parameters can be grouped like that. But I think that an Enumerable#inject with additional parameters wouldalso be useful for many other things, like removing duplicates: def remove_duplicates1(enum) enum.inject([[], nil]) {|(arr, last),elem| arr << elem unless elem== last; [arr, elem] }[0] end def remove_duplicates2(enum) enum.inject([], nil) {|(arr, elem, last| arr << elem unless elem== last; [arr, elem] } end The second one seems looks a lot cleaner. > Also, I'm not sure it's a good idea to put this method in Enumerable. Is> it really general enough? No, it probably is not. This was just a for small experiment (*), iwould not put this into a library.(However, it seems to be preferred to put methods into the class"where they belong" in Ruby instead of using helper classes) Thank you,Levin (*) "...It showed, he said, that the overwhelming odds are that at somepoint in a series of 200 tosses, either heads or tails will come upsix or more times in a row." (0..10_000).select { (0..200).map { rand 2 }.inject([[],nil]) {|(a,last),e| if e==last then a[-1]+=1 else a << 1 end [a,e] }[0].partition { |e| e >= 6 }.first.empty? }.length / 10_000.0 #=> 0.0349 "overwhelming odds" --> 97%