Массив # uniq с блочным эквивалентом в Ruby 1.8.7 - PullRequest
2 голосов
/ 28 декабря 2011

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 ]

4 голосов
/ 28 декабря 2011

Установить Бэкпорт Марка-Андре ЛаФортуна :

https://github.com/marcandre/backports

Имеет блочную версию 1.9.2 Array#uniq и Array#uniq!. Или, если вы не хотите или не нуждаетесь во всем этом, части довольно хорошо изолированы, так что вы можете извлечь только те части, которые вам нужны:

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

2 голосов
/ 28 декабря 2011

Легко реализовать что-то вроде:

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
...