从闭包发送通道信号

Posted

技术标签:

【中文标题】从闭包发送通道信号【英文标题】:Sending channel signal from a closure 【发布时间】:2017-01-06 01:42:31 【问题描述】:

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

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】:

您已声明您的watch 函数接收Fn(String) 类型的闭包。通常闭包类型包括它的返回类型:Fn(String) -&gt; SomeReturnTypeFn(String) 等价于Fn(String) -&gt; (),意味着你的闭包应该返回一个空元组()() 在 C 中的用法与 void 类似。

但是,您尝试使用的闭包 (|x| tx.send(x)) 改为返回 std::result::Result&lt;(), std::sync::mpsc::SendError&lt;std::string::String&gt;&gt;。您可以在Result 上使用unwrap() 来检查操作是否成功并让关闭返回()

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

或者,您可以以这种方式声明watch 函数,以便它可以接收返回任何类型的闭包:

fn watch<F, R>(callback: F)
    where F: Fn(String) -> R

    // ...

但无论如何都应该检查Result

【讨论】:

以上是关于从闭包发送通道信号的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Swift 的闭包中接收方法的输出?

闭包

从闭包案例中学习闭包的作用,会不会由你。

闭包总结:从执行环境来看闭包和垃圾回收

从作用域链谈闭包

闭包漫谈(从抽象代数及函数式编程角度)