2017-10-06 23 views
4

我试图将可变片传递给函数,并在其中的几个循环中使用它。在不重新生成可变片时,在for循环中移动错误

function1产生错误。更改为function2function3会使错误消失,但我不明白function1function2之间的差异。 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 
+1

嗨!你的帖子有两个小问题:1.你的例子不是最小的,2.你问了两个不同的问题。我试图通过编辑你的文章来解决这两个问题,以避免你被低估(你真正的问题是真的很好)。如果您认为我改变太多了,或者您因为其他原因而不同意编辑,请将其回滚! –

回答

3

&mut *v正在做一个所谓的 “rebo​​rrow”。

这意味着,不是迭代原始引用,而是遍历新引用。

想想这样说:


如果你有一个拥有载体,而你遍历它,那么你得到同样的错误,如果你再试一次遍历它,因为它已经被进入for循环。

如果您要借用矢量并迭代借用,那么您可以按照需要多次执行该操作。


如果你有一个可变的借,你遍历它,那么你正在移动的可变借到for循环。所以它现在消失了。

如果相反您创建了一个指向可变借位的新参考,那么您只是移出新参考。一旦迭代结束,新的可变借入消失了,这意味着可以再次访问原始可变借入。

+1

另外。 '对于我在v {...}'desugars中'let mut iter = v.into_iter();同时让Some(i)= iter.next {...}。 'into_iter'消耗'v','(&mut * v).into_iter()'消耗新创建的引用。 – red75prime