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

Rust 为什么在使用futures::ok时出现错误“无法推断类型”?,rust,future,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()); } 我得到了这个错误: 让任务=ve

我知道有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());
}
我得到了这个错误:

让任务=vec![fut_ok1,fut_ok2,fut_ok3]; ---^^^^无法推断“E”的类型` | 考虑“任务”类型
问题是,任何未来理论上都可能返回一个错误。因此,从fut_ok返回的futuresult类型是泛型的,有两个类型参数:T类型表示成功,E类型表示错误

如果这是真实的代码而不是玩具示例,则会有一些错误处理代码,允许编译器推断类型E。在这种情况下,您需要指定它,但由于您不使用它,因此可以使用空类型。因此,以下任何一项都应该起作用:

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


注意,第一个是编译器所说的:考虑赋予任务一个类型。

问题是,任何未来在理论上都可能返回一个错误。因此,从fut_ok返回的futuresult类型是泛型的,有两个类型参数:T类型表示成功,E类型表示错误

如果这是真实的代码而不是玩具示例,则会有一些错误处理代码,允许编译器推断类型E。在这种情况下,您需要指定它,但由于您不使用它,因此可以使用空类型。因此,以下任何一项都应该起作用:

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

注意,第一个是编译器所说的内容:考虑赋予任务一个类型。

完整的例子

外部板条箱期货;//0.1.25 使用futures::future::ok作为fut_ok; 使用futures::future::FutureResult; fn干线{ 让任务:Vec=Vec![fut_ok1,fut_ok2,fut_ok3]; 普林顿! {:?}, 未来::未来::加入所有任务。等待。映射错误 ; } 打印正常[1,2,3]

完整示例

外部板条箱期货;//0.1.25 使用futures::future::ok作为fut_ok; 使用futures::future::FutureResult; fn干线{ 让任务:Vec=Vec![fut_ok1,fut_ok2,fut_ok3]; 普林顿! {:?}, 未来::未来::加入所有任务。等待。映射错误 ; }

打印OK(1, 2, 3)< /P>是否考虑将任务赋予一种类型?让任务:Vec=Vec![fut_-ok1u32,fut_-ok2,fut_-ok3];或者让tasks=vec![fut_ok::1,fut_ok 2,fut_ok 3];你是否考虑过把任务赋予一种类型?让任务:Vec=Vec![fut_-ok1u32,fut_-ok2,fut_-ok3];或者让tasks=vec![fut_ok::1,fut_ok 2,fut_ok 3];美好的如何打印结果?普林顿!{:?},futures::future::加入所有任务。等等?;nice没有实现trait std::error::error。如何打印结果?普林顿!{:?},futures::future::加入所有任务。等等?;未为实现trait std::error::error