预计XYZ发现()(Expected XYZ found ())

2019-10-28 23:06发布

例如:

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代替,但是编译器打印相反。

这是编译器的一个bug,或者已经我错过了什么?

Answer 1:

表面上, tokio::run 期望一个Future相关联Error类型()实际Future的IMPL Receiver具有相关联的Error类型RecvError

然而,锈病的类型推断在两个方向,以及预期和实际类型有时可看到周围的其他方式。 通常情况下消息的措辞符合您的期望,但也有像这样的地方向后感觉的情况。 当然,这是不是太困难的工作是怎么回事,知道其中类型不匹配的,即使它不是最好的方式报道发生。

编纂人解释其中的类型是“实际”和它的“预期”可能不是在一般情况下容易解决的问题,但我认为,这个错误消息是在您所提供的代码混淆。

我找不到任何关于这个问题,但我敢肯定,我已经看到了这个谈过几次了。 如果它之前已经报道,它不会做太大的伤害再次报告,所以我只想做。



文章来源: Expected XYZ found ()