Ruby1.8.7中Array#Uniq的等价物

时间:2012-02-06 08:39:39

标签: ruby-on-rails ruby ruby-1.8 uniq

我之前发布了一个问题 - Issues with DISTINCT when used in conjunction with ORDER,我收到了一个很好的答案,在我的机器上本地工作。但是,当我将它推送到服务器时,代码没有对结果做任何事情......我已经联系了我们的主机提供商,发现服务器上的Ruby版本是1.8.7

考虑到这一点,是否有人能够告诉我如何能够做到相当于

@unique_results = @filtered_names.uniq { |result| result.athlete_id }

以某种方式在我们的服务器上运行?

目前@unique_results@filtered_names相同,重复名称(如原始帖子中所述)保留在输出中。

感谢您的时间

3 个答案:

答案 0 :(得分:2)

如果您使用的是Rails 3.*,则可以使用Array#uniq_by

否则你可以查看它的实现(它非常简单,点击页面上的Show source查看)并做类似的或只是重新打开Array类并添加uniq_by方法你自己。

答案 1 :(得分:2)

您可以将Marc-André Lafortunebackports添加到您的宝石列表中,其中包括uniq的阻止以及大量其他内容。如果你只是想要那一件,你也可以选择更新后的uniq。{/ p>

答案 2 :(得分:2)

掌握Ruby的一个步骤是学习在需要一些足够通用的功能时扩展核心类作为“核心”操作。如果你的编程背景是动态较少的语言,这将需要一些人习惯。在这种情况下,我会添加这样的东西:

require 'set'
module Enumerable
  def uniq(&b)
    if block_given?
      self.map(&b).to_set.to_a
    else
      self.to_set.to_a
    end
  end
end

它不如Ruby 1.9内置的uniq有效,但它仍然是O(n)。

将此添加到Enumerable意味着您可以在阵列以外的其他内容上使用它。如果某个可枚举类定义了更高效的版本,则不会覆盖它 - Ruby方法查找算法首先检查直接在类中定义的方法,然后查找包含模块中定义的方法。

如果您经常使用Ruby 1.8,可以将其添加到您自己的个人核心扩展的文件中,并在将来的项目中使用它。如果您有兴趣,可以在https://github.com/alexdowad/showcase/blob/master/ruby-core/collections.rb看到我的个人核心扩展(这些是针对Ruby 1.9)。