2015-07-11 25 views
8

Böyle bir şeyim var.Çoklu kapanmada Arc nasıl paylaşılır

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

ben bu soruyla anlıyorum

capture of moved value: arc 

alıyorum. ark kapanmadan önce klon çağrılmaz. i her kapanış işlevini tanımlayarak bunu düzeltebilir ve arkı kapatacak şekilde klonlayabilir, başka bir seçenek var mı?

cevap

10

Bunun bir yolu yoktur. Bir kapamada kullanılmadan önce Arc klonlamalısınız. Bu genellikle spawn() ile birlikte yapılır

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

:

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(); 
    }); 
} 
ortak desen iç içe geçmiş bir kapsamda aynı isme klonlanmış Arc yeniden bağlamak için