Rust 如何将futures 0.1迭代器收集到向量中?
我正在尝试使用Rust 1.36.0和futures 0.1构建期货向量Rust 如何将futures 0.1迭代器收集到向量中?,rust,future,Rust,Future,我正在尝试使用Rust 1.36.0和futures 0.1构建期货向量 为什么下面的代码不起作用 有没有更惯用的方法来构建Futures的列表/列表 这不会编译: error[E0277]:无法通过迭代器在'std::boxed::Box'类型的元素上构建'std::vec::vec'类型的集合` -->src/main.rs:6:10 | 6 |收集(); |^^^^^无法从“std::iter::Iterator”生成“std::vec::vec”类型的集合` | =help:trait`
Future
s的列表/列表error[E0277]:无法通过迭代器在'std::boxed::Box'类型的元素上构建'std::vec::vec'类型的集合`
-->src/main.rs:6:10
|
6 |收集();
|^^^^^无法从“std::iter::Iterator”生成“std::vec::vec”类型的集合`
|
=help:trait`std::iter::fromtiterator`未为`std::vec::vec'实现`
为什么呢?我怀疑在将futures::Finished
转换为
时出现问题,因为这样可以很好地编译:
pub fn create_some_boxed_ints() {
let mapped: Vec<Box<i32>> = (0..10).map(|_| Box::new(132)).collect();
}
pub fn创建一些装箱的整数(){
让映射:Vec=(0..10).map(| | Box::new(132)).collect();
}
我不确定是什么问题。函数future::ok
返回实现future
的futuresult
,我希望它与dyn future
兼容
我正在玩这个旧版本的futures板条箱,因为我想参与的另一个项目是使用0.1版本。我知道
Future
的关联类型是0.3.x中的Output
。如果我切换到更新的版本,也许我不会有这个问题,但我想了解上面的情况,以便更好地理解生锈。错误消息在1.39.0上是相同的。为什么下面的代码不起作用?
我不认为这个问题是特定于您正在使用的futures版本的-如果我更新您的代码以使用Future
,那么我会得到
这里的问题是映射函数需要将一个具体的未来强制为一个trait对象
在Rust参考中,在上一节中,它将强制位置描述为:
所需类型是显式的或可以通过从显式类型传播而派生的位置(无类型推断)
代码需要强制的上下文需要类型推断—从所需的容器类型到map
函数的返回类型进行反向工作。这座桥太远了
您可以通过显式转换为trait对象来克服它:
Box::new(futures::future::ok(132)) as Box<dyn futures::future::Future<Output = Result<i32, i32>>>
这将允许隐式强制生效
是否有更惯用的方法来构建未来的列表/列表?s
这将取决于未来是如何创造的,以及它们将用于什么目的
- 您可以定义类型别名:
type MyDynFuture = Box<dyn futures::future::Future<Output = Result<i32, i32>>>;
Box::new(futures::future::ok(132)) as Box<dyn futures::future::Future<Output = Result<i32, i32>>>
let mapped: Vec<Box<dyn futures::future::Future<Output = Result<i32, i32>>>> = (0..10)
.map(|_| -> Box<dyn futures::future::Future<Output = Result<i32, i32>>> {
Box::new(futures::future::ok(132))
})
.collect();
type MyDynFuture = Box<dyn futures::future::Future<Output = Result<i32, i32>>>;
let mapped: Vec<MyDynFuture> = (0..10)
.map(|_| -> MyDynFuture {
Box::new(futures::future::ok(132))
})
.collect();
let i = (0..10)
.map(|n| -> futures::future::Ready<Result<i32,i32>> {
futures::future::ok(n)
});
join_all(i)