From: Logan Capaldo Date: 2005-05-07T05:49:21+09:00 Subject: Re: Array#squeeze On 5/6/05, Mark Hubbart wrote: > On 5/6/05, Logan Capaldo wrote: > > On 5/6/05, Martin DeMello wrote: > > > The recent mention of String#squeeze made me wonder if it would not be a > > > good idea to add a #squeeze method to Array (or possibly even to > > > Enumerable) as well. Certainly I've needed it at least as often as I've > > > needed #uniq > > > > > > martin > > > > > > > > > > Well here's a possible implementation: > > > > module Enumerable > > def squeeze(*args) > > raise ArgumentError.new("Provide 0 or 1 arguments") if > > args.length > 1 > > inject([]) do |a, b| > > if args.length == 0 > > if b == a.last > > a > > else > > a << b > > end > > else > > if b == a.last && a.last == args[0] > > a > > else > > a << b > > end > > end > > end > > end > > end > > String's squeeze allows arbitrary numbers of character arguments. II > would think Enumerable#squeeze should do the same: > > module Enumerable > def squeeze(*args) > ary = [] > check = proc{|item| args.empty?? true : args.include?(item) } > each{|elem| ary << elem unless ary.last == elem and check[elem] } > ary > end > end > > cheers, > Mark > > String's squeeze does, but their are problems with duplicating the exact semantics of String#squeeze because according to the documentation it uses the intersection of the strings passed as an argument and has support for ranges of strings (ie "m-z"). Ranges would be pretty easy just use x..y.include? but if we are following the same semantics as String#squeeze your implementation is incorrect. I will admit yours is more succint then my silly nested ifs. ;)