在不重新生成可变片时,在for循环中移动错误
我试图将可变片传递给函数,并在其中的几个循环中使用它。在不重新生成可变片时,在for循环中移动错误
function1
产生错误。更改为function2
或function3
会使错误消失,但我不明白function1
和function2
之间的差异。 v
和&mut *v
与我相似。
为什么function1
不工作而其他人呢?
fn main() {
let mut v = Vec::new();
function1(&mut v);
function2(&mut v);
function3(&mut v);
}
// Move Error
fn function1(v: &mut [i32]) {
for l in v {}
for l in v {} // <-- Error Here !!!
}
// Works Fine
fn function2(v: &mut [i32]) {
for l in &mut *v {}
for l in &mut *v {}
}
// Works Fine
fn function3(v: &mut [i32]) {
for l in v.iter_mut() {}
for l in v.iter_mut() {}
}
错误:
error[E0382]: use of moved value: `v`
--> src/main.rs:12:14
|
11 | for l in v {}
| - value moved here
12 | for l in v {} // <-- Error Here !!!
| ^value used here after move
|
= note: move occurs because `v` has type `&mut [i32]`, which does not implement the `Copy` trait
&mut *v
正在做一个所谓的 “reborrow”。
这意味着,不是迭代原始引用,而是遍历新引用。
想想这样说:
如果你有一个拥有载体,而你遍历它,那么你得到同样的错误,如果你再试一次遍历它,因为它已经被进入for循环。
如果您要借用矢量并迭代借用,那么您可以按照需要多次执行该操作。
如果你有一个可变的借,你遍历它,那么你正在移动的可变借到for循环。所以它现在消失了。
如果相反您创建了一个指向可变借位的新参考,那么您只是移出新参考。一旦迭代结束,新的可变借入消失了,这意味着可以再次访问原始可变借入。
另外。 '对于我在v {...}'desugars中'let mut iter = v.into_iter();同时让Some(i)= iter.next {...}。 'into_iter'消耗'v','(&mut * v).into_iter()'消耗新创建的引用。 – red75prime
嗨!你的帖子有两个小问题:1.你的例子不是最小的,2.你问了两个不同的问题。我试图通过编辑你的文章来解决这两个问题,以避免你被低估(你真正的问题是真的很好)。如果您认为我改变太多了,或者您因为其他原因而不同意编辑,请将其回滚! –