2017-05-08 22 views
2

このような状況に対処するための最良の方法は何ですか:関数からJoinHandleを返すにはどうすればよいですか?

use std::thread; 

struct Prefe; 

fn main() { 
    let prefe = Prefe; 

    start(&prefe).join(); 
} 

fn start(pre: &Prefe) -> thread::JoinHandle { 
    thread::spawn(move || { 
     println!("Test spawn"); 
    }) 
} 

私はエラーを取得する:

error[E0243]: wrong number of type arguments: expected 1, found 0 
    --> src/main.rs:11:26 
    | 
11 | fn start(pre: &Prefe) -> thread::JoinHandle { 
    |       ^^^^^^^^^^^^^^^^^^ expected 1 type argument 

私はこのようなものを使用することができると思うが、私は使用するかわかりませんTのために:

fn start<T>(pre: &Prefe, t: T) -> thread::JoinHandle<T> { 
    thread::spawn(move || { 
     println!("Test spawn"); 
    }) 
} 

私はthread::spawnを返すために、これを使用しますが、これは私を助けることができるか、それを使用する方法ならば、私は知らないことを参照してください。

Builder::new().spawn(f).unwrap() 

これが動作しているようですが、これは正しいか間違った方法であれば、私にはわからない:

fn start(pre: &Prefe) -> thread::JoinHandle<()> { 
    thread::spawn(move || { 
     println!("Test spawn"); 
    }) 
} 

答えて

3

レビューthread::spawnの機能シグネチャ:

pub fn spawn<F, T>(f: F) -> JoinHandle<T> 
where 
    F: FnOnce() -> T, 
    F: Send + 'static, 
    T: Send + 'static, 

これはと言いますspawnは汎用タイプFです。このタイプは、形質FnOnceを実装する必要があります。その実装は引数を取らず、タイプTの引数を返します。 spawnは、と同じタイプTでパラメータ化されたJoinHandleを返します。

この情報を使用するには、クロージャが返すタイプを知る必要があります。一度それを知ったら、それはあなたのJoinHandleがパラメータ化されるべきタイプです。それはこのJoinHandleが使用するものですので、

あなたの例の閉鎖は、()の戻り値の型を持っているprintln!を呼び出します。

+0

あなたの説明をお寄せいただきありがとうございます。私は 'i32'を返すともっと明確になると思います。例えば、' - > JoinHandle 'Oの引数として' O 'を指定してください。 –

関連する問題