2016-08-29 19 views
0

次のコードを使用して、クロージャ内から信号を送信しようとしています。クロージャからのチャンネル信号の送信

use std::thread; 
use std::sync::mpsc::channel; 

fn main() { 
    let (tx, rx) = channel(); 

    let t1 = thread::spawn(move || { 
     watch(|x| tx.send(x)); 
    }); 

    let t2 = thread::spawn(move || { 
     println!("{:?}", rx.recv().unwrap()); 
    }); 

    let _ = t1.join(); 
    let _ = t2.join(); 
} 

fn watch<F>(callback: F) where F : Fn(String) { 
    callback("hello world".to_string()); 
} 

はしかし、それは次のエラーを上げるコンパイル失敗:

src/test.rs:8:19: 8:29 note: expected type `()` 
src/test.rs:8:19: 8:29 note: found type `std::result::Result<(), std::sync::mpsc::SendError<std::string::String>>` 

私は何かが足りないのですか?

答えて

3

watch関数は、Fn(String)のクロージャを受け取ると宣言しました。通常、クロージャータイプには戻り値のタイプが含まれます:Fn(String) -> SomeReturnTypeFn(String)Fn(String) ->()に相当し、クロージャーが空のタプル()を返す必要があることを意味します。 ()は、voidとよく似ています。

ただし、使用しようとしているクロージャ(|x| tx.send(x))は、代わりにstd::result::Result<(), std::sync::mpsc::SendError<std::string::String>>を返します。それは任意の型を返すクロージャを受け取ることができるので、あなたは、このような方法でwatch関数を宣言することができ、また

watch(|x| tx.send(x).unwrap()); 

:あなたは、操作がsuccededていることを確認すると、閉鎖リターン()を作るためにResultunwrap()を使用することができます

fn watch<F, R>(callback: F) 
    where F: Fn(String) -> R 
{ 
    // ... 
} 

しかし、とにかくResultをチェックする必要があります。

関連する問題