从闭包发送通道信号
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) -> SomeReturnType
。 Fn(String)
等价于Fn(String) -> ()
,意味着你的闭包应该返回一个空元组()
。 ()
在 C 中的用法与 void
类似。
但是,您尝试使用的闭包 (|x| tx.send(x)
) 改为返回 std::result::Result<(), std::sync::mpsc::SendError<std::string::String>>
。您可以在Result
上使用unwrap()
来检查操作是否成功并让关闭返回()
:
watch(|x| tx.send(x).unwrap());
或者,您可以以这种方式声明watch
函数,以便它可以接收返回任何类型的闭包:
fn watch<F, R>(callback: F)
where F: Fn(String) -> R
// ...
但无论如何都应该检查Result
。
【讨论】:
以上是关于从闭包发送通道信号的主要内容,如果未能解决你的问题,请参考以下文章