dogs = names.zip(breeds).map { |name, breed| Dog.new(name, breed) }
Array#zip
intercala la matriz de destino con elementos de los argumentos, por lo
irb> [1, 2, 3].zip(['a', 'b', 'c'])
#=> [ [1, 'a'], [2, 'b'], [3, 'c'] ]
Puede utilizar matrices de diferentes longitudes (en cuyo caso la matriz de destino determina la longitud de la matriz resultante, con el entradas adicionales completadas con nil
).
irb> [1, 2, 3, 4, 5].zip(['a', 'b', 'c'])
#=> [ [1, 'a'], [2, 'b'], [3, 'c'], [4, nil], [5, nil] ]
irb> [1, 2, 3].zip(['a', 'b', 'c', 'd', 'e'])
#=> [ [1, 'a'], [2, 'b'], [3, 'c'] ]
También puede comprimir más de dos matrices conjuntamente:
irb> [1,2,3].zip(['a', 'b', 'c'], [:alpha, :beta, :gamma])
#=> [ [1, 'a', :alpha], [2, 'b', :beta], [3, 'c', :gamma] ]
Array#map
es una gran manera de transformar una matriz, ya que devuelve una matriz en donde cada entrada es el resultado de ejecutar el bloque de la entrada correspondiente en la matriz de destino.
irb> [1,2,3].map { |n| 10 - n }
#=> [ 9, 8, 7 ]
Al usar iteradores sobre matrices de matrices, si se le da un bloque de parámetros múltiples, las entradas de matriz se romperá automáticamente en esos parámetros:
irb> [ [1, 'a'], [2, 'b'], [3, 'c'] ].each { |array| p array }
[ 1, 'a' ]
[ 2, 'b' ]
[ 3, 'c' ]
#=> nil
irb> [ [1, 'a'], [2, 'b'], [3, 'c'] ].each do |num, char|
...> puts "number: #{num}, character: #{char}"
...> end
number 1, character: a
number 2, character: b
number 3, character: c
#=> [ [1, 'a'], [2, 'b'], [3, 'c'] ]
Como Matt Briggsmentioned, #each_with_index
es otra buena herramienta saber sobre. Se repite a través de los elementos de una matriz, pasando un bloque cada elemento a su vez.
irb> ['a', 'b', 'c'].each_with_index do |char, index|
...> puts "character #{char} at index #{index}"
...> end
character a at index 0
character b at index 1
character c at index 2
#=> [ 'a', 'b', 'c' ]
Al utilizar un iterador como #each_with_index
se pueden utilizar paréntesis para romper elementos de la matriz en sus partes constituyentes:
irb> [ [1, 'a'], [2, 'b'], [3, 'c'] ].each_with_index do |(num, char), index|
...> puts "number: #{num}, character: #{char} at index #{index}"
...> end
number 1, character: a at index 0
number 2, character: b at index 1
number 3, character: c at index 2
#=> [ [1, 'a'], [2, 'b'], [3, 'c'] ]
+1, el suyo es mejor –
1 'zip' http://ruby-doc.org/core/classes/Array.html#M002198 – OscarRyz