首页 > 解决方案 > 为什么我在使用 futures::ok 时会收到错误“无法推断类型”?

问题描述

我知道有,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

标签: rustfuture

解决方案


问题是理论上任何未来都可能返回错误。因此,FutureResult类型(从 中返回fut_ok)是具有两个类型参数的泛型:T成功类型E和错误类型。

如果这是真实代码而不是玩具示例,您将拥有一些错误处理代码,允许编译器推断 type 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一个类型”时的意思。


推荐阅读