"Belorion" <belorion / gmail.com> schrieb im Newsbeitrag news:a48d774d05012607334cd93e1e / mail.gmail.com... >I have an array of arrays. I want to be able to do a uniq operation > on my array, and have it accept a block so I can specify what to > examine for uniqueness. For example, in IRB > > a = [ [1,2], [3,4], [1,3] ] > a.sort { |x,y| x[0] <=> y[0] } > > returns => [ [1,2], [1,3], [3,4] ] > > However, it does not appear uniq accepts blocks: > > a = [ [1,2], [3,4], [1,3] ] > a.uniq { |x,y| x[0] == y[0] } > > returns => [ [1,2], [3,4], [1,3] ] > and a.uniq! with the above block returns nil. > > Am I stuck writing my own deep_uniq? Granted, it would be hard, but > certainly not as clean as the above. The block is accepted but apparently not used: >> %w{a b c d a d}.uniq {|*x| p x} => ["a", "b", "c", "d"] Could be a bug in the std lib. (Btw, I'm on 1.8.1 here) How about using a Hash in the meantime? >> h = a.inject({}){|h,(k,v)| h[k] ||= [k,v];h} => {1=>[1, 2], 3=>[3, 4]} >> h.values => [[1, 2], [3, 4]] Or >> h = a.inject({}){|h,pair| h[pair[0]] ||= pair;h} => {1=>[1, 2], 3=>[3, 4]} >> h.values => [[1, 2], [3, 4]] Kind regards robert