【问题标题】:Why do I get the error "cannot infer type" when using futures::ok?为什么我在使用 futures::ok 时会收到错误“无法推断类型”?
【发布时间】:2018-11-16 10:05:29
【问题描述】:

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

【问题讨论】:

  • 你有没有考虑考虑给tasks一个类型? let tasks : Vec<FutureResult<_, ()>> = vec![fut_ok(1u32), fut_ok(2), fut_ok(3)];let tasks = vec![fut_ok::<_, ()>(1), fut_ok(2), fut_ok(3)];

标签: rust future


【解决方案1】:

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

【讨论】:

  • 不错。以及如何打印结果? println!("{:?}", futures::future::join_all(tasks).wait()?); 特征 std::error::Error 没有为 () 实现
【解决方案2】:

完整示例

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 1970-01-01
    • 2017-12-10
    相关资源
    最近更新 更多