为什么在使用futures :: ok时出现错误“无法推断类型”?

时间:2018-11-15 13:09:35

标签: rust future

我知道有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 :(得分:4)

问题在于理论上任何未来都可能返回错误。因此,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提供类型”时的意思。

答案 1 :(得分:0)

完整示例

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])