다음을 달성하는 Ruby 방법은 무엇입니까?
a = [1,2]
b = [3,4]
나는 배열을 원한다 :
=> [f(1,3) ,f(1,4) , f(2,3) ,f(2,4)]
다음을 달성하는 Ruby 방법은 무엇입니까?
a = [1,2]
b = [3,4]
나는 배열을 원한다 :
=> [f(1,3) ,f(1,4) , f(2,3) ,f(2,4)]
답변:
를 사용 product
하여 배열의 데카르트 곱을 먼저 얻은 다음 함수 결과를 수집 할 수 있습니다.
a.product(b) => [[1, 3], [1, 4], [2, 3], [2, 4]]
따라서 map
또는 collect
을 사용 하여 결과를 얻을 수 있습니다 . 동일한 방법에 대해 다른 이름입니다.
a.product(b).collect { |x, y| f(x, y) }
[a,b,c,d].reduce([[]]){|r,e| r=r.product(e)}.map{|x| x.flatten}
a.map {|x| b.map {|y| f(x,y) } }.flatten
참고 : 1.8.7+ 1
에서는 flatten에 인수로 추가 할 수 있으므로 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]
[a[0], b[0]]
및 의 배열을 생성합니다[a[1], b[1]]
. 포함되지 않습니다[a[0], b[1]]
.a.zip(b) => [[1,3],[2,4]]