[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Re: uniq on custom objects

Robert Klemme

10/29/2007 2:33:00 PM

2007/10/29, daniel åkerud <daniel.akerud@gmail.com>:
> I cannot get uniq to work with an array of custom class-objects. It seems
> overriding hash is now enough. This is what I mean:
>
> class Obj
> attr_reader :name, :number
> def initialize(name, number)
> @name = name
> @number = number
> end
> def hash
> return @name.hash
> end
> end
>
> a = [Obj.new("apa", 1), Obj.new("apa", 2), Obj.new("smisk", 3)]
>
> => [#<Obj:0x31baca8 @number=1, @name="apa">, #<Obj:0x31bac80 @number=2,
> @name="apa">, #<Obj:0x31bac58 @number=3, @name="smisk">]
>
> a.uniq
>
> => [#<Obj:0x31baca8 @number=1, @name="apa">, #<Obj:0x31bac80 @number=2,
> @name="apa">, #<Obj:0x31bac58 @number=3, @name="smisk">]
>
> But i want only one instance of "apa", and it doesn't matter which. Is there
> something else I have to override?

You can make your life much easier by using Struct:

Obj = Struct.new :name do
attr_accessor :number
def initialize(name, number)
self.name = name
self.number = number
end
end

irb(main):008:0> a = [Obj.new("apa", 1), Obj.new("apa", 2), Obj.new("smisk", 3)]
=> [#<struct Obj name="apa">, #<struct Obj name="apa">, #<struct Obj
name="smisk">]
irb(main):009:0> a.uniq
=> [#<struct Obj name="apa">, #<struct Obj name="smisk">]

Kind regards

robert