【问题标题】:Equivalent of Array#Uniq in Ruby1.8.7Ruby1.8.7中Array#Uniq的等价物
【发布时间】:2012-02-06 18:19:14
【问题描述】:

我之前发布了一个问题 - 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 相同,并且重复名称(如原始帖子中所述)保留在输出中。

感谢您的宝贵时间

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您可以将Marc-André Lafortunebackports 添加到您的宝石列表中,其中包括uniq 的块和大量其他内容。如果您只想要那一件,您也可以从 backports 中挑选更新后的 uniq

      【讨论】:

        【解决方案3】:

        掌握 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 的)。

        【讨论】:

          猜你喜欢
          • 2015-12-22
          • 2012-01-29
          • 2011-08-31
          • 1970-01-01
          • 1970-01-01
          • 2013-06-16
          • 2016-09-16
          • 1970-01-01
          • 2019-11-03
          相关资源
          最近更新 更多