Rust 如何将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`

我正在尝试使用Rust 1.36.0和futures 0.1构建期货向量

  • 为什么下面的代码不起作用
  • 有没有更惯用的方法来构建
    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)