Rubyproduct方法在字符串数组的情况下表现不同
根据官方文档
[1,2].product([3,4],[5,6])
=> [[1, 3, 5], [1, 3, 6], [1, 4, 5], [1, 4, 6], [2, 3, 5], [2, 3, 6], [2, 4, 5], [2, 4, 6]]
返回所有数组中元素的所有组合的数组。
然而,
first_array = ["orange", "purple", "colour-black"]
other_arrays = [["sputter", "ribus"], ["incontinentia", "portia"]]
@end_array = first_array.product(other_arrays)
返回,意外:
[["orange", ["sputter", "ribus"]], ["orange", ["incontinentia", "portia"]], ["purple", ["sputter", "ribus"]], ["purple", ["incontinentia", "portia"]], ["colour-black", ["sputter", "ribus"]], ["colour-black", ["incontinentia", "portia"]]]
为什么 ruby 的行为不同?怎样做才能得到设计的结果?
回答
[1,2].product([3,4],[5,6])
这一行将两个参数传递给.product.
@end_array = first_array.product(other_arrays)
这条线是通过一个单一的参数.product,这恰好是一个数组的数组。现在这个结果有意义吗?它相当于:
[1,2].product([[3,4],[5,6]])
您可以使用splat 运算符( *)将数组解构为单独的参数:
first_array = ["orange", "purple", "colour-black"]
other_arrays = [["sputter", "ribus"], ["incontinentia", "portia"]]
@end_array = first_array.product(*other_arrays)
=> [["orange", "sputter", "incontinentia"],
["orange", "sputter", "portia"],
["orange", "ribus", "incontinentia"],
["orange", "ribus", "portia"],
["purple", "sputter", "incontinentia"],
["purple", "sputter", "portia"],
["purple", "ribus", "incontinentia"],
["purple", "ribus", "portia"],
["colour-black", "sputter", "incontinentia"],
["colour-black", "sputter", "portia"],
["colour-black", "ribus", "incontinentia"],
["colour-black", "ribus", "portia"]]