我正在编写一个函数,它应该接收几个向量并产生它们的笛卡尔积(所有的配对组合)作为按行主序的向量。换句话说,如果我有:
let x_coords = vec![1, 2, 3];
let y_coords = vec![4, 5, 6];
我想要制作
vec![ [1,4], [1,5], [1,6], [2,4], [2,5], [2,6], [3,4], [3,5], [3,6] ]
这似乎是使用.flat_map()
的完美工作:
fn main() {
let x_coords = vec![1, 2, 3];
let y_coords = vec![4, 5, 6];
let coord_vec: Vec<[isize; 2]> =
x_coords.iter().map(|&x_coord| {
y_coords.iter().map(|&y_coord| {
[x_coord, y_coord]
})
}).flat_map(|s| s).collect();
// Expecting to get: vec![ [1,4], [1,5], [1,6], [2,4], [2,5], [2,6], [3,4], [3,5], [3,6] ]
println!("{:?}", &coord_vec);
}
但这样是行不通的,因为
&x_coord
的生命周期不够长。根据编译器的说法,它最终会进入y_coords
映射中,然后永远无法重新出来。我尝试在闭包中使用
.clone()
和 move
,但编译器以多个 Note:
行的形式给了我一个奇怪而又不清晰的讲解。我对
flat_map
完全没有头绪,还是有救吗?
move
闭包始终以值方式进行捕获,非move
闭包则总是通过引用进行捕获(如果必要,则使用可变借用,否则使用不可变借用)。 - Francis Gagnémove
:请看这里。 - Lukas Kalbertodtflat_map
应该如何工作。这是一个很棒的答案! - bright-starmove
操作。但是,如果一个方法/函数只需要通过引用获取它,那么它只会到达那里。move
强制所有变量都被移入。 - Shepmaster