![](/img/trans.png)
[英]How do I convert the “largest value in a Vec” example in the Rust book to not use the Copy trait?
[英]How to avoid "move occurs because `v` has type `Vec<char>`, which does not implement the `Copy` trait" within loop
似乎这里发生了被禁止的借用,但我没有看到绕过它的方法来做我需要做的事情。 在循环中设置 mut 值之后,我尝试将其保存到另一个 Vec 中时,似乎会出现问题。 有没有一种干净的方法来解决这个问题,或者有一种方法可以向编译器展示这个动作,这样我就不会得到错误? 我将在代码片段下方包含错误:
let mut result: Vec<String> = vec![];
let mut v = vec![];
for idx in 0..board.spaces.len() {
let c: char = match board.count_at(idx as u32) {
0 => ' ',
1 => '1',
2 => '2',
3 => '3',
4 => '4',
5 => '5',
6 => '6',
7 => '7',
8 => '8',
_ => 'F'
};
v.push(c);
if idx as u32 + 1 % board.width == 0 {
result.push(v.into_iter().collect());
v.clear();
}
}
错误:
error[E0382]: borrow of moved value: `v`
--> src/lib.rs:41:9
|
26 | let mut v = vec![];
| ----- move occurs because `v` has type `Vec<char>`, which does not implement the `Copy` trait
...
41 | v.push(c);
| ^^^^^^^^^ value borrowed here after move
...
44 | result.push(v.into_iter().collect());
| ----------- `v` moved due to this method call, in previous iteration of loop
|
note: this function takes ownership of the receiver `self`, which moves `v`
您的代码不起作用的原因是因为.into_iter()
消耗了Vec
并且以后不能再在程序中使用它。 您可以通过以下方式解决此问题:
result.push(v.iter().clone().collect());
但我会将临时数据保存在String
中,并将其克隆推送到Vec
:
let mut result: Vec<String> = vec![];
let mut s = String::new();
for idx in 0..board.spaces.len() {
let c: char = match board.count_at(idx as u32) {
0 => ' ',
1 => '1',
2 => '2',
3 => '3',
4 => '4',
5 => '5',
6 => '6',
7 => '7',
8 => '8',
_ => 'F'
};
s.push(c);
if idx as u32 + 1 % board.width == 0 {
result.push(s.clone());
s.clear();
}
}
您可以将Vec::append()
用于“清空自己,将所有元素传递给新向量”:
let mut result: Vec<String> = vec![];
let mut v = vec![];
for idx in 0..board.spaces.len() {
let c: char = match board.count_at(idx as u32) {
0 => ' ',
1 => '1',
2 => '2',
3 => '3',
4 => '4',
5 => '5',
6 => '6',
7 => '7',
8 => '8',
_ => 'F'
};
v.push(c);
if idx as u32 + 1 % board.width == 0 {
let mut s = Vec::new();
s.append(&mut v); // Pass all elements from `v` to `s`.
result.push(s.into_iter().collect());
}
}
您也可以直接使用String
并使用push()
推送字符,但由于String
不包含append
方法,您可以使用std::mem::take()
:
let mut result: Vec<String> = vec![];
let mut v = String::new();
for idx in 0..board.spaces.len() {
let c: char = match board.count_at(idx as u32) {
0 => ' ',
1 => '1',
2 => '2',
3 => '3',
4 => '4',
5 => '5',
6 => '6',
7 => '7',
8 => '8',
_ => 'F'
};
v.push(c);
if idx as u32 + 1 % board.width == 0 {
result.push(std::mem::take(&mut v));
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.