2016-05-23 3 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クロージャを呼び出すことはできません(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(); 
} 
関連する問題