从闭包发送通道信号

时间:2016-08-29 22:33:28

标签: rust channel

我尝试使用以下代码从闭包内发送信号。

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

我错过了什么吗?

1 个答案:

答案 0 :(得分:3)

您已声明您的Rails.application.routes.draw do devise_for :users root 'homes#show' resources :users, only: [:show, :edit, :update] resources :posts, only: [:new, :create] resource :relationships, only: [:create, :destroy] 函数收到watch类型的闭包。通常,闭包类型包括其返回类型:Fn(String)Fn(String) -> SomeReturnType相当于Fn(String),意味着您的闭包应该返回一个空元组Fn(String) -> ()()通常与C中的()类似。

但是,您尝试使用的关闭(void)会返回|x| tx.send(x)。您可以在std::result::Result<(), std::sync::mpsc::SendError<std::string::String>>上使用unwrap()来检查操作是否已成功并使闭包返回Result

()

或者,您可以以这种方式声明watch(|x| tx.send(x).unwrap()); 函数,以便它可以接收返回任何类型的闭包:

watch

但是无论如何都应该检查fn watch<F, R>(callback: F) where F: Fn(String) -> R { // ... }