Ожидаемый XYZ найден () - PullRequest
       34

Ожидаемый XYZ найден ()

0 голосов
/ 15 апреля 2019

Например:

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 Ответ

5 голосов
/ 16 апреля 2019

На поверхности tokio::run ожидает a Future со связанным Error типом (), но фактический Future импл Receiver ассоциируется Error тип RecvError.

Однако вывод типа Rust работает в обоих направлениях, и ожидаемый и фактический типы иногда можно увидеть наоборот. Обычно формулировка сообщения соответствует вашим ожиданиям, но есть ситуации, подобные этой, когда она ощущается задом наперед. Конечно, не сложно понять, что происходит, и знать, где происходит несовпадение типов, даже если об этом не сообщается наилучшим образом.

Кодирование человеческой интерпретации того, какой тип "фактический" , а какой "ожидаемый" , может быть нелегкой задачей в общем случае, но я согласен, что это Сообщение об ошибке сбивает с толку в коде, который вы предоставили.

Я не мог найти проблему по этому поводу, но я уверен, что видел, как об этом говорили несколько раз раньше. Если об этом сообщалось раньше, не будет большого вреда, если сообщу об этом снова, поэтому я бы просто сделал это.

...