gpt4 book ai didi

rust - 从闭包发送 channel 信号

转载 作者:行者123 更新时间:2023-11-29 08:25:26 25 4
gpt4 key购买 nike

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

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

我错过了什么吗?

最佳答案

您已声明您的 watch函数接收类型为 Fn(String) 的闭包.通常闭包类型包括它的返回类型:Fn(String) -> SomeReturnType . Fn(String)相当于Fn(String) -> ()并且意味着你的闭包应该返回一个空元组 () . ()通常使用类似于 void在 C 中。

但是,您尝试使用的闭包 ( |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
{
// ...
}

但是 Result无论如何都应该检查。

关于rust - 从闭包发送 channel 信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39216185/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com