arrays.map { |a,*b| a.zip(*b) }
#=> [
# [["ab", "ik", "rs"], ["cd", "lm", "tu"], ["ef", "no", "vw"],
# ["gh", "pq", "xy"]],
# [["z1", "89", "GH"], ["23", "AB", "IJ"], ["45", "CD", "KL"],
# ["67", "EF", "MN"]]
# ]
Это использует то, что называется Разложение массива . arrays
состоит из двух элементов. Когда первая передается в блок, переменным блока a
и b
присваиваются следующие значения:
a, *b = arrays[0]
#=> [["ab", "cd", "ef", "gh"], ["ik", "lm", "no", "pq"],
# ["rs", "tu", "vw", "xy"]]
Мы видим, что
a #=> ["ab", "cd", "ef", "gh"]
b #=> [["ik", "lm", "no", "pq"], ["rs", "tu", "vw", "xy"]]
Здесь - хорошее объяснение того, как работает оператор splat (*
) Ruby. Комбинация декомпозиции массива и оператора splat - мощный инструмент, который необходимо освоить каждому Rubyist. вместо этого. Обратное верно, если каждый элемент массива имеет одинаковое количество элементов. Поскольку мы сопоставляем, последнее требование применяется отдельно к array[0]
и array[1]
.