【问题标题】:Array#uniq with block equivalent in Ruby 1.8.7Array#uniq 与 Ruby 1.8.7 中的块等效
【发布时间】:2012-01-29 00:34:59
【问题描述】:

Array#uniq 在 Ruby 1.9 中有这种行为

c = [ "a:def", "a:xyz", "b:abc", "b:xyz", "c:jkl" ]
c.uniq {|s| s[/^\w+/]}  #=> [ "a:def", "b:abc", "c:jkl" ]

它可以占用一个块并就我们所提供的东西提供独特的价值。但是,这在 Ruby 1.8 中不起作用。如何在 ruby​​ 1.8 中创建此功能?

【问题讨论】:

  • 为什么要使用 Ruby 1.8?它将变得过时。
  • @sawa:也许他已经有一个使用 1.8 的项目,但现在没有预算或时间来升级。
  • 或者在不允许升级的机器上。

标签: ruby arrays ruby-1.8


【解决方案1】:

很容易实现类似的东西:

class Array
    def uniq
        ret, keys = [], []
        each do |x|
            key = block_given? ? yield(x) : x
            unless keys.include? key
                ret << x
                keys << key
            end
        end
        ret
    end
end

【讨论】:

    【解决方案2】:

    安装Marc-André LaFortune's backports gem:

    https://github.com/marcandre/backports

    具有 1.9.2 的 Array#uniqArray#uniq! 的块版本。或者,如果您不想要或不需要整件东西,这些部件可以很好地隔离,因此您可以只取出您需要的部分:

    https://github.com/marcandre/backports/blob/master/lib/backports/1.9.2/array.rb#L99

    【讨论】:

    • aahh..这是马克本人在我的其他问题之一中提到的..我怎么忘记了...谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多