Ruby on rails 阻止重复项添加到Ruby对象数组中

Ruby on rails 阻止重复项添加到Ruby对象数组中,ruby-on-rails,ruby,Ruby On Rails,Ruby,如何使用对象的属性来匹配相同的对象,从而消除ruby对象数组中的重复元素 对于基本类型的数组,我可以使用一个集合 例如 我可以调整此技术以处理对象属性吗 谢谢怎么样 您也可以在对象上使用它 如果您可以将其写入对象以使用eql?,那么您可以使用uniq感谢您的回复。。一旦我将以下内容添加到我的对象模型中,uniq就会工作 def ==(other) other.class == self.class && other.id == self.id end alias

如何使用对象的属性来匹配相同的对象,从而消除ruby对象数组中的重复元素

对于基本类型的数组,我可以使用一个集合

例如

我可以调整此技术以处理对象属性吗

谢谢

怎么样


您也可以在对象上使用它

如果您可以将其写入对象以使用
eql?
,那么您可以使用
uniq

感谢您的回复。。一旦我将以下内容添加到我的对象模型中,uniq就会工作

def ==(other)
    other.class == self.class &&
    other.id  == self.id
end
alias :eql? :==

我认为你是本末倒置。你在问自己:“我如何得到<代码> UNIQ来删除不相等的对象?”但是你应该问自己:“为什么这两个对象不相等,尽管我认为它们是一样的?”

换言之:您似乎在试图解决对象破坏了平等语义这一事实,而您真正应该做的只是修复这些破坏的平等语义

以下是一个
产品的示例,其中,如果两个产品具有相同的型号,则认为它们相等:

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
类产品
def初始化(类型_编号)
self.type\u编号=type\u编号
结束
def==(其他)
类型\编号==其他类型\编号
结束
def eql?(其他)
other.is_a?(self.class)和&type_number.eql?(other.type_number)
结束
def散列
键入\u number.hash
结束
受保护的
属性读取器:键入属性编号
私有的
属性写入器:键入\u编号
结束
需要“测试/单元”
类TestHashEquality
您应该使用
数组
,还是应该使用
集合
?如果顺序不重要,那么后者将使检查重复项更加有效。

他说的是对象属性,所以我猜完整的对象不会完全相同。嗨。。比恩斯是对的。。需要匹配对象id,例如。。。我可以将一个块传递到to_集或uniq方法吗?@Dom:看起来你可以将一个块传递到
to_集
:。没有显示它的确切功能,但我猜它会解决您的问题。@ryeguy、
*args
&block
只是被发送到
Set\initialize
看到这违反了
Object\hash
的约定,也可能违反了
Object\,如果我想使用“<代码> Type号> /代码>考虑我的产品对于一个用途的独特性,但是使用不同的字段,例如,<代码>颜色< /代码>以供另一种使用吗?理想情况下,最好能够使用一个块,就像用于排序的比较方法一样。有什么想法吗?嗨。理想情况下,如果已添加(基于匹配属性),我希望防止将对象添加到对象数组中。我以为布景可以做到这一点。
def ==(other)
    other.class == self.class &&
    other.id  == self.id
end
alias :eql? :==
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