1

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

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

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

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

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

谢谢你的时间

4

3 回答 3

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

它不会像uniqRuby 1.9 中内置的那样高效,但它仍然是 O(n)。

将它添加到 Enumerable 意味着您可以将它用于数组以外的东西。如果某个可枚举类定义了更高效的版本,则不会覆盖它——Ruby 方法查找算法首先检查直接在类中定义的方法,然后再查找在包含模块中定义的方法。

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

于 2012-02-06T10:19:14.623 回答
2

您可以将Marc-André Lafortune的反向移植添加到您的 gem 列表中,其中包括 for of 的块uniq和大量其他内容。uniq如果您只想要那一件,您也可以从 backports 中挑选出更新的版本。

于 2012-02-06T08:53:41.010 回答
2

如果你使用 Rails 3.*,你可以使用Array#uniq_by.

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

于 2012-02-06T08:45:27.637 回答