【发布时间】:2022-01-21 18:09:53
【问题描述】:
我有一个向量,如下所示。
let m: Vec<Vec<u64>> = vec![
vec![1, 2, 3, 4, 5],
vec![1, 2, 3, 4, 5],
vec![1, 2, 3, 4, 5],
vec![1, 2, 3, 4, 5],
vec![1, 2, 3, 4, 5]
];
而add 函数旨在将两个向量的每个元素相加。
fn add(xs: &Vec<u64>, ys: &Vec<u64>) -> Vec<u64> {
xs.iter().zip(ys.iter()).map(|(x, y)| x + y).collect()
}
现在,我想fold 向量m 的向量。
我尝试的是:
let s: Vec<u64> = m[1..]
.iter()
.fold(m[0], |acc, xs| add(&acc, xs));
但是这段代码没有通过编译器。
|
16 | .fold(m[0], |acc, xs| add(&acc, xs));
| ^^^^ move occurs because value has type `Vec<u64>`, which does not implement the `Copy` trait
我尝试添加 & 但编译器仍然拒绝:
|
16 | .fold(&m[0], |acc, xs| add(&acc, xs));
| ^^^^^ expected struct `Vec`, found `&Vec<u64>`
|
= note: expected struct `Vec<u64>`
found reference `&Vec<u64>`
help: consider removing the borrow
|
16 - .fold(&m[0], |acc, xs| add(&acc, xs));
16 + .fold(m[0], |acc, xs| add(&acc, xs));
|
我认为add 函数的签名是正确的,因为它不想获取参数向量的所有权,并且它返回一个新向量,因此应将所有权传递给调用者。
实际上,我尝试了所有可能的组合(从函数中添加/删除& 等),但无法使代码通过编译器。
你能告诉我我错过了什么,上面的代码有什么问题吗?谢谢。
【问题讨论】:
-
fold的第一个参数必须与其输出的类型相同。因此传递& m[0](类型为& Vec<u64>)是行不通的,因为您希望折叠返回Vec<u64>。一种选择是以m[0].clone()作为初始值。显然,这确实涉及克隆,但无论如何您都需要以某种方式分配输出。