2016-05-23 43 views
0

在Rust中,我想指定一個回調函數(例如閉包),以便在發生某些有趣事情時由工作線程調用。回調的正確類型簽名是什麼?將閉包移動到線程時,「無法藉助不可變內容作爲可變內容」

這是什麼,我試圖做一個例子:

use std::thread; 

fn spawner(f: Box<FnMut()->()+Send>) -> thread::JoinHandle<()> { 
    thread::spawn(move || { 
     f(); 
    }) 
} 


fn main() { 
    let cb = || { 
     println!("callback"); 
    }; 
    spawner(Box::new(cb)).join().unwrap(); 
} 
src/main.rs:5:9: 5:10 error: cannot borrow immutable `Box` content 
`*f` as mutable 

src/main.rs:5   f(); 

回答

2

可變性魯斯特是繼承:因爲變量f抱着箱子是不可改變的,的內容盒子也是不變的。一個不可變的關閉不能被調用(FnMut需要改變其環境的能力)。

解決方法:把這些變量f可變:

fn spawner(mut f: Box<FnMut()->()+Send>) -> thread::JoinHandle<()>

1

鏽病編譯器是不是讓你不可改變的說法f進入關閉。將其更改爲可變(在變量之前添加mut)編譯器將停止抱怨,並且您將獲得所需的行爲。

use std::thread; 

fn spawner(mut f: Box<FnMut()->()+Send>) -> thread::JoinHandle<()> { 
    thread::spawn(move || { 
     f(); 
    }) 
} 


fn main() { 
    let cb = || { 
     println!("callback"); 
    }; 
    spawner(Box::new(cb)).join().unwrap(); 
} 
相關問題