Я думаю, ты ставишь телегу перед лошадью. Вы спрашиваете себя: «Как я могу заставить uniq
удалить объекты, которые не равны?» Но то, что вы должны задать себе: «Почему эти два объекта не равны, несмотря на то, что я считаю их такими?»
Другими словами: кажется, что вы пытаетесь обойти тот факт, что ваши объекты имеют нарушенную семантику равенства, когда то, что вы действительно должны сделать, это просто исправление этой нарушенной семантики равенства .
Вот пример для Product
, где два продукта считаются равными, если они имеют одинаковый номер типа:
class Product
def initialize(type_number)
self.type_number = type_number
end
def ==(other)
type_number == other.type_number
end
def eql?(other)
other.is_a?(self.class) && type_number.eql?(other.type_number)
end
def hash
type_number.hash
end
protected
attr_reader :type_number
private
attr_writer :type_number
end
require 'test/unit'
class TestHashEquality < Test::Unit::TestCase
def test_that_products_with_equal_type_numbers_are_considered_equal
assert_equal 2, [Product.new(1), Product.new(2), Product.new(1)].uniq.size
end
end