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