已找到预期的XYZ()

时间:2019-04-15 17:55:35

标签: compiler-errors rust type-inference rust-tokio

例如:

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,但编译器会显示相反的内容。

这是编译器中的错误,还是我错过了什么?

1 个答案:

答案 0 :(得分:4)

在表面上,tokio::run 期望一个Future,具有关联的Error类型(),但实际 Future的{​​{1}}隐含关联了Receiver类型的Error

但是,Rust的类型推断在两个方向上都有效,有时可以从其他方向看到预期和实际的类型。 通常消息的措词符合您的期望,但是在这种情况下,这种感觉会倒退。当然,即使没有以最好的方式报告,也不难弄清正在发生的事情并知道发生类型不匹配的地方。

在一般情况下,整理人类对哪种类型的解释是“实际” 和哪种“期望的” 可能不是一个容易解决的问题,但是我同意该错误消息使您提供的代码令人困惑。

我找不到与此相关的问题,但是我敢肯定,我之前已经看过几次。如果以前已经报告过,那么再次报告不会有太大危害,所以我就这样做。