首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Ruby中删除相同的对象?

在Ruby中删除相同的对象?
EN

Stack Overflow用户
提问于 2009-10-30 23:26:02
回答 4查看 2.3K关注 0票数 5

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

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-10-30 23:36:06

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

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

例如,如果字符串包含相同的文本,则认为它们是相等的,而不管它们共享相同的内存分配。

代码语言:javascript
复制
a = b = "foo"
c = "foo"

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

大部分核心对象都是这样的,但ruby对象不是这样。

代码语言:javascript
复制
class Foo
end

a = Foo.new
b = Foo.new

a.eql? b
# => false

Ruby鼓励您根据您的类上下文重新定义==操作符。

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

代码语言:javascript
复制
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]
票数 11
EN

Stack Overflow用户

发布于 2012-02-23 23:19:49

对于遇到这个问题的任何其他人来说,自从这个问题第一次被提出以来,事情似乎发生了一些变化,在较新的Ruby版本(至少是1.9.3)中,Array.uniq假设除了.eql?==之外,您的对象还具有#hash方法的一个有意义的实现。

票数 6
EN

Stack Overflow用户

发布于 2009-10-30 23:31:31

uniq使用eql?,如this thread中所述。

有关==equal?eql?之间的区别,请参阅the official ruby documentation

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1650475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档