2016-08-29 4 views
0

다음 코드를 사용하여 클로저 내에서 신호를 보내려고합니다.클로저에서 보내는 채널 신호

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>>` 

내가 뭔가를 놓치고 있습니까 :

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()); 
} 

그러나, 다음과 같은 오류를 제기 컴파일 실패?

답변

3

귀하의 watch 함수가 Fn(String) 유형의 마감을 받았다고 선언하셨습니다. 일반적으로 클로저 유형에는 반환 유형이 포함됩니다 (Fn(String) -> SomeReturnType). Fn(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은 확인해야합니다.