2015-07-11 8 views
8

我有這樣的事情。如何在多次封閉中共享弧線

let arc = Arc::new(); 
|| { 
    arc.clone() 
} 
||{ 
    arc.clone() 
} 

我越來越

capture of moved value: arc 

我明白爲什麼我收到此。在arc傳遞給閉包之前,不會調用該克隆。 我可以通過在函數中定義每個閉包並在將其傳遞給閉包之前克隆該弧來修復此問題,還有其他選擇嗎?

回答

10

有沒有辦法解決它。在關閉中使用之前,您應該克隆Arc。共同模式是克隆Arc重新結合相同的名稱在嵌套範圍:

let arc = Arc::new(1); 
{ 
    let arc = arc.clone(); 
    || { /* do something with arc */ } 
} 
{ 
    let arc = arc.clone(); 
    || { /* do something else with arc */ } 
} 

這通常與spawn()一起做:

let arc = Arc::new(Mutex::new(SomeSharedData::new())); 
for _ in (0..NUM_THREADS) { 
    let arc = arc.clone(); 
    thread::spawn(move || { 
     let mut shared_data = arc.lock(); 
     shared_data.do_something(); 
    }); 
}