Começando com esta matriz, de quantas maneiras diferentes você pode criar duas matrizes de cada outro elemento:
array = %w(key_a value_a key_b value_b key_c value_c)
1
hash = Hash[*array]
hash.keys
hash.values
2
Hash[*array].to_a.transpose
2b (Hash [] aceita uma matriz compactada, bem como uma sequência de argumentos.)
Hash[array.each_slice(2).to_a].to_a.transpose
3
array.each_slice(2).to_a.transpose
4
array.partition { |v| array.index(v).even? }
5
keys = []
values = []
array.each_slice(2) do |key, value|
keys << key
values << value
end
6
keys = []
values = []
array.each_index do |index|
if index.even?
keys << array[index]
else
values << array[index]
end
end
7
keys = []
values = []
until array.empty?
keys << array.shift
values << array.shift
end
7b (praticamente a mesma coisa que o anterior)
collection = [Array.new, Array.new]
collection.map! { |a| a << array.shift } until array.empty?
8
array.values_at *array.each_index.select(&:even?)
array.values_at *array.each_index.select(&:odd?)
9 (ligeiramente diferente do anterior)
array.each_index.select(&:even?).map { |i| array[i] }
array.each_index.select(&:odd?).map { |i| array[i] }
10
(0..(array.size - 1)).step(2).map { |i| array[i] }
(1..(array.size - 1)).step(2).map { |i| array[i] }
10b (praticamente a mesma coisa que o anterior)
2.times.map do |n|
(n..(array.size - 1)).step(2).map { |i| array[i] }
end
11 (um pouco estranho)
collection = { true => [], false => [] }
array.each_index { |i| collection[i.even?] << array[i] }
collection.values
Eu perdi alguma coisa?