2015-07-11 20 views
8

Mam coś takiego.Jak udostępnić Arc w wielu zamknięciach

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

jestem coraz

capture of moved value: arc 

rozumiem dlaczego ja dostaję to. klon nie jest wywoływany zanim łuk zostanie przekazany do zamknięcia. mogę to naprawić, definiując każde zamknięcie w funkcji i sklonować łuk przed przekazaniem go do zamknięcia, czy istnieje inna opcja?

Odpowiedz

10

Nie da się tego obejść. Powinieneś sklonować kod Arc, zanim zostanie on użyty w zamknięciu. Wspólny wzór jest do ponownego wiązania klonowanego Arc tej samej nazwie zagnieżdżonej zakresie:

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

Odbywa się to zazwyczaj wraz z 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(); 
    }); 
} 
Powiązane problemy