2015-04-16 49 views
0

我可以製作此矢量的副本,但這需要時間和內存。 我可以寫另一個println,但這僅僅是一個例子 - 而不是println可能會有幾個循環 - 它會佔用空間並使代碼複雜化。我可以在main中執行轉換並編寫函數調用的兩個版本,但更改引用要容易得多。爲什麼我不能在「if」中引用內存?

fn foo(mut a: &Vec<i32>) { 
    let mut c: Vec<i32>; 

    if a[0] == 0 { 
     c = vec![1; 3]; 
     a = &c; 
    } 

    println!("{:?}", a); 
} 

fn main() { 
    let a: Vec<i32> = vec![0; 3]; 
    foo(&a); 
} 

錯誤:

main.rs:9:14: 9:15 error: `c` does not live long enough 
main.rs:9   a = &c; 
        ^

回答

2

防鏽壽命的規則很(非常)嚴格的:如果你有一個對象的引用,這個對象必須活得比參考,在這兩個方向

這意味着必須在對象之後創建參考

在你的情況下,a之前存在c,所以分配a = &c是無效的。一個簡單的修正可以創建引用的副本創建,並在此副本工作崗位c

fn foo(vec_ref: &Vec<i32>){ 

    let mut c: Vec<i32>; 
    let mut a = vec_ref 

    if a[0] == 0 { 
     c = vec![1; 3]; 
     a = &c; 
    } 
    println!("{:?}",a); 
} 

或更生鏽方式:

fn foo(vec_ref: &Vec<i32>){ 

    let mut c: Vec<i32>; 
    let a = if vec_ref[0] == 0 { 
     c = vec![1; 3]; 
     &c 
    } else { 
     vec_ref 
    }; 
    println!("{:?}",a); 
} 
+0

無需拷貝,你可以交換'c'和'a'的值。 –

+0

我正在談論複製*參考*而不是矢量。 – Levans

+0

啊,好的。但是OP沒有想要'ver_ref'發生變異? –

相關問題