"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