2016-08-29 7 views
0

Ich versuche, ein Signal aus einer Schließung zu senden, mit dem folgenden Code.Sendekanalsignal von einer Schließung

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

vermag jedoch nicht die Erstellung der folgenden Fehler verursacht:

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

bin ich etwas fehlt?

Antwort

3

Sie haben angegeben, dass Ihre watch-Funktion eine Schließung des Typs Fn(String) empfängt. Normalerweise enthält ein Schließungstyp seinen Rückgabetyp: Fn(String) -> SomeReturnType. Fn(String) entspricht Fn(String) ->() und bedeutet, dass Ihre Schließung ein leeres Tupel () zurückgeben sollte. () wird oft ähnlich wie void in C.

jedoch die Schließung verwenden Sie versuchen (|x| tx.send(x)) gibt std::result::Result<(), std::sync::mpsc::SendError<std::string::String>> stattdessen verwendet. Sie können unwrap() auf dem Result verwenden um zu überprüfen, dass die Operation succeded haben und die Schließung Rückkehr () zu machen:

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

Alternativ Sie watch Funktion in einer solchen Art und Weise erklären kann, so dass es einen Verschluss Rückkehr jede Art empfangen kann:

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

Aber die Result sollte trotzdem überprüft werden.

Verwandte Themen