例如:
use futures::future::Future;
fn main() {
let (stop_tokio, time_to_stop) = tokio::sync::oneshot::channel::<()>();
let handler = std::thread::spawn(|| {
tokio::run(
time_to_stop, // .map_err(|_| ())
);
});
handler.join().expect("join failed");
}
编译器打印错误:
error[E0271]: type mismatch resolving `<tokio_sync::oneshot::Receiver<()> as futures::future::Future>::Error == ()`
--> src/main.rs:6:9
|
6 | tokio::run(
| ^^^^^^^^^^ expected struct `tokio_sync::oneshot::error::RecvError`, found ()
|
= note: expected type `tokio_sync::oneshot::error::RecvError`
found type `()`
= note: required by `tokio::runtime::threadpool::run`
代码需要()
,取而代之的是RecvError
,但编译器会显示相反的内容。
这是编译器中的错误,还是我错过了什么?
答案 0 :(得分:4)
在表面上,tokio::run
期望一个Future
,具有关联的Error
类型()
,但实际 Future
的{{1}}隐含关联了Receiver
类型的Error
。
但是,Rust的类型推断在两个方向上都有效,有时可以从其他方向看到预期和实际的类型。 通常消息的措词符合您的期望,但是在这种情况下,这种感觉会倒退。当然,即使没有以最好的方式报告,也不难弄清正在发生的事情并知道发生类型不匹配的地方。
在一般情况下,整理人类对哪种类型的解释是“实际” 和哪种“期望的” 可能不是一个容易解决的问题,但是我同意该错误消息使您提供的代码令人困惑。
我找不到与此相关的问题,但是我敢肯定,我之前已经看过几次。如果以前已经报告过,那么再次报告不会有太大危害,所以我就这样做。