a.map {|x| b.map {|y| f(x,y) } }.flatten
Примечание: На 1.8.7+ вы можете добавить 1
в качестве аргумента для выравнивания, так что вы все равно получите правильные результаты, когда f
вернет массив.
Вот абстракция для произвольного числа массивов:
def combine_arrays(*arrays)
if arrays.empty?
yield
else
first, *rest = arrays
first.map do |x|
combine_arrays(*rest) {|*args| yield x, *args }
end.flatten
#.flatten(1)
end
end
combine_arrays([1,2,3],[3,4,5],[6,7,8]) do |x,y,z| x+y+z end
# => [10, 11, 12, 11, 12, 13, 12, 13, 14, 11, 12, 13, 12, 13, 14, 13, 14, 15, 12, 13, 14, 13, 14, 15, 14, 15, 16]