如何使用对象的属性来消除ruby对象数组中的重复元素以匹配相同的对象。
有一系列基本类型我可以使用一套..
例如
array_list = [1, 3, 4 5, 6, 6]
array_list.to_set
=> [1, 2, 3, 4, 5, 6]
我可以使用这种技术来处理对象属性吗?
感谢
答案 0 :(得分:3)
我认为你把车推到马前。你问自己:“我如何让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
答案 1 :(得分:2)
如果您可以将其写入对象以使用eql?
,那么您可以使用uniq
。
答案 2 :(得分:0)
答案 3 :(得分:0)
您是否应该使用Array
,还是应该使用Set
?如果订单不重要,那么后者将更有效地检查重复。
答案 4 :(得分:-1)
感谢您的回复..一旦我将以下内容添加到我的对象模型
,uniq就可以了def ==(other)
other.class == self.class &&
other.id == self.id
end
alias :eql? :==