在Ruby 1.8.7中使用块等效的数组#uniq

时间:2011-12-28 08:24:45

标签: ruby arrays ruby-1.8

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中创建此功能?

2 个答案:

答案 0 :(得分:4)

安装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

答案 1 :(得分:2)

很容易实现类似:

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