2017-10-06 32 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