2011-12-28 4 views
2

Array#uniq имеет такое поведение в Ruby 1.9массив # уник с блоком эквивалент в Руби 1.8.7

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?

+0

Почему вы хотите использовать Ruby 1.8? Он станет устаревшим. – sawa

+0

@sawa: Возможно, у него уже есть проект с использованием 1.8 и без бюджета или времени для обновления прямо сейчас. –

+0

Или на машине, где ему не разрешено ее обновлять. –

ответ

4

Установить Marc-André LaFortune's Backports перл:

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

+0

aahh..Это было упомянуто самим марком в одном из моих других вопросов .. как я забыл это ... спасибо – rubyprince

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 
+3

http://apidock.com/rails/Array/uniq_by – tokland

+1

http://apidock.com/ rails/Array/uniq_by – tokland

+0

Спасибо, что он отлично работает :) – Emanuel