删除Ruby中相同的对象?

删除Ruby中相同的对象?,ruby,arrays,no-duplicates,Ruby,Arrays,No Duplicates,我现在正在写一个Ruby应用程序,它将在twitter上搜索各种东西。我将要面对的一个问题是,在时间上,彼此非常接近的搜索之间共享结果。结果以对象数组的形式返回,每个对象都是一条tweet。我知道ruby中的Array.uniq方法,它返回一个包含所有重复项的数组 我的问题是。如果这些对象指向内存中相同的空间,或者它们包含相同的信息,uniq方法是否会删除重复项 如果是前者,根据内容从数组中删除重复项的最佳方法是什么?uniq使用eql?,如中所述 有关=、equal?和eql?之间的区别,请参

我现在正在写一个Ruby应用程序,它将在twitter上搜索各种东西。我将要面对的一个问题是,在时间上,彼此非常接近的搜索之间共享结果。结果以对象数组的形式返回,每个对象都是一条tweet。我知道ruby中的Array.uniq方法,它返回一个包含所有重复项的数组

我的问题是。如果这些对象指向内存中相同的空间,或者它们包含相同的信息,uniq方法是否会删除重复项


如果是前者,根据内容从数组中删除重复项的最佳方法是什么?

uniq
使用
eql?
,如中所述


有关
=
equal?
eql?
之间的区别,请参阅。我相信
数组。uniq
通过对象的
eql?
=
方法检测重复项,这意味着其比较基于内容,而不是内存中的位置(假设对象基于内容提供有意义的
eql?
实现)

uniq方法是否删除重复项 只要这些物体指向 内存中的相同空间或它们 是否包含相同的信息

该方法依赖于
eql?
方法,因此它删除了a.eql?(b)返回true的所有元素。 确切的行为取决于您正在处理的特定对象

例如,如果字符串包含相同的文本,则无论它们共享相同的内存分配,字符串都被视为相等

a = b = "foo"
c = "foo"

[a, b, c].uniq
# => ["foo"]
大多数核心对象都是这样,但ruby对象则不然

class Foo
end

a = Foo.new
b = Foo.new

a.eql? b
# => false
Ruby鼓励您根据类上下文重新定义
=
操作符

在您的特定情况下,我建议创建一个表示twitter结果的对象,并实现您的比较逻辑,以便Array.uniq的行为符合您的预期

class Result

  attr_accessor :text, :notes

  def initialize(text = nil, notes = nil)
    self.text = text
    self.notes = notes
  end

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

end

a = Result.new("first")
b = Result.new("first")
c = Result.new("third")

[a, b, c].uniq
# => [a, c]

对于其他遇到这个问题的人来说,自从这个问题第一次被提出以来,以及在更新的Ruby版本中(至少是1.9.3),情况似乎有了一些变化,
Array.uniq
假设您的对象除了
.eql?
==

之外,还有一个有意义的方法实现。谢谢,我在类中实现了所需的方法,它现在似乎正在工作。谢天谢地,我唯一真正需要比较的是每个tweet的唯一ID:)我假设
other.class=self.class
应该是
other.class==self.class
?如果不重写
散列方法,我就无法实现这一点。看见