Cách Ruby để đạt được sau đây là gì?
a = [1,2]
b = [3,4]
Tôi muốn một mảng:
=> [f(1,3) ,f(1,4) , f(2,3) ,f(2,4)]
Cách Ruby để đạt được sau đây là gì?
a = [1,2]
b = [3,4]
Tôi muốn một mảng:
=> [f(1,3) ,f(1,4) , f(2,3) ,f(2,4)]
Câu trả lời:
Bạn có thể sử dụng productđể lấy tích các-ten của các mảng trước, sau đó thu thập các kết quả của hàm.
a.product(b) => [[1, 3], [1, 4], [2, 3], [2, 4]]
Vì vậy, bạn có thể sử dụng maphoặc collectđể nhận được kết quả. Chúng là các tên khác nhau cho cùng một phương pháp.
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
Lưu ý: Trên 1.8.7+, bạn có thể thêm 1làm đối số để làm phẳng, vì vậy bạn sẽ vẫn nhận được kết quả chính xác khi ftrả về một mảng.
Đây là một sự trừu tượng cho một số mảng tùy ý:
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]
Các khía cạnh Array#productsẽ cung cấp cho bạn tích chéo của các mảng. Nó cũng được gọi là bí danh ** operatorđối với trường hợp hai mảng. Sử dụng nó, nó sẽ trông như thế này:
require 'facets/array'
a = [1,2]
b = [3,4]
(a.product b).collect {|x, y| f(x, y)}
Nếu bạn đang sử dụng Ruby 1.9, productlà một hàm Array được tích hợp sẵn.
[a[0], b[0]]và[a[1], b[1]]. Nó sẽ không bao gồm[a[0], b[1]].a.zip(b) => [[1,3],[2,4]]