Почему я получаю сообщение об ошибке «не могу определить тип» при использовании futures :: ok? - PullRequest
0 голосов
/ 15 ноября 2018

Я знаю, что есть join_all, но он не может определить тип:

extern crate futures; // 0.1.25

use futures::future::ok as fut_ok;

fn main() {
    let tasks = vec![fut_ok(1), fut_ok(2), fut_ok(3)];
    println!("{:?}", futures::future::join_all(tasks).wait().unwrap());
}

Я получил эту ошибку:

let tasks = vec![fut_ok(1), fut_ok(2), fut_ok(3)];
    -----        ^^^^^^ cannot infer type for `E`
    |
    consider giving `tasks` a type

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

Полный пример

extern crate futures; // 0.1.25
use futures::future::ok as fut_ok;
use futures::future::FutureResult;
fn main() {
    let tasks: Vec<FutureResult<_, ()>> = vec![fut_ok(1), fut_ok(2), fut_ok(3)];
    println!(
        "{:?}",
        futures::future::join_all(tasks).wait().map_err(|_| "Error")
    );
}

Отпечатки Ok([1, 2, 3])

0 голосов
/ 15 ноября 2018

Проблема в том, что любое будущее теоретически может вернуть ошибку. Таким образом, тип FutureResult (который возвращается из fut_ok) является общим с двумя параметрами типа: тип T для успеха и тип E для ошибок.

Если бы это был реальный код вместо игрушечного примера, у вас был бы некоторый код обработки ошибок, который позволил бы компилятору выводить тип E. В этом случае вам нужно указать его, но так как вы его не используете, вы можете использовать пустой тип (). Таким образом, любое из следующих должно работать:

let tasks: Vec<FutureResult<_, ()>> = vec![fut_ok(1), fut_ok(2), fut_ok(3)];

или

let tasks = vec![fut_ok::<_, ()>(1), fut_ok(2), fut_ok(3)];

Обратите внимание, что первое, что имеет в виду компилятор, когда он говорит: «рассмотрите возможность придания tasks типа».

...