Pat*_*rty 5 ruby arrays no-duplicates
我正在编写一个Ruby应用程序,它将在Twitter上搜索各种各样的东西.我要面对的问题之一是在时间上彼此非常接近的搜索之间的共享结果.结果以对象数组的形式返回,每个对象都是一条推文.我知道ruby中的Array.uniq方法返回一个删除了所有重复项的数组.
我的问题是这个.只要这些对象指向内存中的相同空间或它们包含相同的信息,uniq方法是否会删除重复项?
如果是前者,那么根据内容从阵列中删除重复项的最佳方法是什么?
Sim*_*tti 11
只要这些对象指向内存中的相同空间或它们包含相同的信息,uniq方法是否会删除重复项?
该方法依赖于该eql?方法,因此它删除了a.eql?(b)返回true的所有元素.确切的行为取决于您正在处理的特定对象.
例如,如果字符串包含相同的文本,则它们被认为是相等的,无论它们共享相同的内存分配.
a = b = "foo"
c = "foo"
[a, b, c].uniq
# => ["foo"]
Run Code Online (Sandbox Code Playgroud)
大多数核心对象都是如此,但对于ruby对象则不然.
class Foo
end
a = Foo.new
b = Foo.new
a.eql? b
# => false
Run Code Online (Sandbox Code Playgroud)
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]
Run Code Online (Sandbox Code Playgroud)