Array#uniq with Hash elements... can't remove duplicates

Hello,

I am having some trouble trying to remove duplicate data from an array
of hashes. I’ve read on the pickaxe book that Array#uniq detects
duplicates using the eql? method on the elements, but it doesn’t seem to
work even if I monkeypatch the Hash class:

class Hash
def eql? other
self == other
end
end

a={:foo=>‘bar’}
b={:foo=>‘bar’}
array=[a,b]

a.eql? b
=> true
array.uniq
=> [{:foo=>“bar”}, {:foo=>“bar”}]

Of course, I’d like to get only [{:foo=>"bar}] as a result. Thanks in
advance for any help…

Andrea

http://myretrocomputing.altervista.org

andrea pisze:

end
end

you also need to define #hash method:

class Hash
def eql? other
self == other
end

def hash
h = 0
each_pair do |k, v|
h ^= k.hash
h *=137
h ^= v.hash
end
h
end
end

lopex

andrea:

I’ve read on the pickaxe book that Array#uniq detects duplicates using
the eql? method on the elements, but it doesn’t seem to work even if
I monkeypatch the Hash class:

class Hash
def eql? other
self == other
end
end

Hashes of the objects must also match:

[email protected]:~$ irb

class Hash
def hash
to_a.hash
end
alias eql? ==
?> end
=> nil

a = {:foo => ‘bar’}
=> {:foo=>“bar”}

b = {:foo => ‘bar’}
=> {:foo=>“bar”}

[a,b].uniq
=> [{:foo=>“bar”}]

That said, monkeypatching Hash in this way is a (very) bad idea.

– Shot

Marcin Miel?y?ski [email protected] wrote:

you also need to define #hash method:

Thank you !

Andrea

http://myretrocomputing.altervista.org

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs