index - ruby zip




Como mapear com índice em Ruby? (7)

Acima da ofuscação superior:

arr = ('a'..'g').to_a
indexes = arr.each_index.map(&2.method(:+))
arr.zip(indexes)

Qual é a maneira mais fácil de converter

[x1, x2, x3, ... , xN]

para

[[x1, 2], [x2, 3], [x3, 4], ... , [xN, N+1]]

Aqui estão mais duas opções para 1.8.6 (ou 1.9) sem usar o enumerador:

# Fun with functional
arr = ('a'..'g').to_a
arr.zip( (2..(arr.length+2)).to_a )
#=> [["a", 2], ["b", 3], ["c", 4], ["d", 5], ["e", 6], ["f", 7], ["g", 8]]

# The simplest
n = 1
arr.map{ |c| [c, n+=1 ] }
#=> [["a", 2], ["b", 3], ["c", 4], ["d", 5], ["e", 6], ["f", 7], ["g", 8]]

Eu costumo fazer isso:

arr = ["a", "b", "c"]

(0...arr.length).map do |int|
  [arr[int], int + 2]
end

#=> [["a", 2], ["b", 3], ["c", 4]]

Em vez de iterar diretamente sobre os elementos da matriz, você está interagindo com um intervalo de inteiros e os usando como índices para recuperar os elementos da matriz.


Eu sempre gostei da sintaxe deste estilo:

a = [1, 2, 3, 4]
a.each_with_index.map { |el, index| el + index }
# => [1, 3, 5, 7]

Invocando each_with_index você obtém um enumerador que pode ser facilmente each_with_index com seu índice disponível.


Se você estiver usando o ruby ​​1.8.7 ou 1.9, você pode usar o fato de que métodos iteradores como each_with_index , quando chamados sem um bloco, retornam um objeto Enumerator , ao qual você pode chamar Enumerable methods like map on. Então você pode fazer:

arr.each_with_index.map { |x,i| [x, i+2] }

Na versão 1.8.6 você pode fazer:

require 'enumerator'
arr.enum_for(:each_with_index).map { |x,i| [x, i+2] }

Uma maneira divertida, mas inútil de fazer isso:

az  = ('a'..'z').to_a
azz = az.map{|e| [e, az.index(e)+2]}

a = [1, 2, 3]
p [a, (2...a.size+2).to_a].transpose




indexing