dogs = names.zip(breeds).map { |name, breed| Dog.new(name, breed) }
Array#zip
交织与的参数元素的目标阵列,所以
irb> [1, 2, 3].zip(['a', 'b', 'c'])
#=> [ [1, 'a'], [2, 'b'], [3, 'c'] ]
可以使用不同长度的阵列(在该情况下,目标阵列决定了所得阵列的长度,与额外的条目填入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'] ]
您也可以压缩多于两个阵列一起:
irb> [1,2,3].zip(['a', 'b', 'c'], [:alpha, :beta, :gamma])
#=> [ [1, 'a', :alpha], [2, 'b', :beta], [3, 'c', :gamma] ]
Array#map
是改造的阵列的好方法,因为它返回一个阵列,其中每个条目是上运行的块的结果目标数组中的相应条目。
irb> [1,2,3].map { |n| 10 - n }
#=> [ 9, 8, 7 ]
当使用迭代过数组的数组,如果得到多个参数块,该阵列的条目将被自动分成那些参数:
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'] ]
像Matt Briggsmentioned,#each_with_index
是另一个很好的工具了解。它遍历数组的元素,依次传递每个元素的块。
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' ]
当使用像#each_with_index
迭代器,你可以用括号把数组元素分解成它们的组成部分:
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,你是好 – 2010-04-15 20:45:15
+1'zip' http://ruby-doc.org/core/classes/Array.html#M002198 – OscarRyz 2010-04-15 20:52:48