2014-10-04 57 views
0

我想寫一個生鏽的二叉樹,可以在proc之間傳遞,而不必每次都複製。我很難理解如何在生命週期中對鐵鏽的限制做到這一點。以下給出error: 'l' does not live long enougherror: 'r' does not live long enough「生活不夠長」在生鏽

#[deriving(Show)] 
struct node<'a> { 
    left: &'a int, 
    right: &'a int 
} 

let l = 3; 
let r = 4; 
let n = node { 
    left: &l, 
    right: &r 
}; 

spawn(proc() { 
    println!("{}", n); 
}); 

我明白爲什麼它會認爲他們活得不夠長,但我應該如何重組這個問題,以便他們這樣做?任何幫助都非常感謝

回答

2

在你的情況下,你創建一個Node對象,引用你在你定義的變量main()函數,並將它傳遞給一個新的任務。問題是:你完全不能保證這個任務會在你的main()的任務之前完成,並且你會在參考之前冒着原始變量超出範圍的風險,從而導致錯誤。

給你希望建立一棵樹,我覺得最簡單的解決辦法是有你的Node類擁有它的領域,如:

#[deriving(Show)] 
struct Node { 
    left: int, 
    right: int 
} 

然後你會沒有更多liftetime問題。

然後要在幾個任務之間共享它而不復制它,可以使用std::sync::Arc包裝器:它正是它的功能。你可以這樣做:

use std::sync::Arc; 

fn main() { 

    let n = Arc::new(Node { 
     left: 3, 
     right: 4 
    }); 

    for _ in range(0u, 10) { 
     let n_proc = n.clone(); 
     spawn(proc() { 
      println!("{}", *n_proc); 
     }); 
    } 
} 

如果你需要給到Node你的其他任務寫訪問,以及,你可能會想將其包裝在一個MutexRWlock,保持一個Arc內整個事情。