Nig*_*Str 12 asynchronous future rust
我应该使用什么类型的向量来存储 future?
我尝试在同一个 URL 上发出多个并发请求,并将所有 future 保存到向量中以与join_all.
如果我没有明确设置向量的类型,则一切正常。我知道 Rust 可以找到变量的正确类型。CLion 确定向量类型为Vec<dyn Future<Output = ()>>,但是当我尝试自己设置类型时,它给了我一个错误:
error[E0277]: the size for values of type `dyn core::future::future::Future<Output = ()>` cannot be known at compilation time
  --> src/lib.rs:15:23
   |
15 |     let mut requests: Vec<dyn Future<Output = ()>> = Vec::new();
   |                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
   |
   = help: the trait `std::marker::Sized` is not implemented for `dyn core::future::future::Future<Output = ()>`
   = note: to learn more, visit <https://doc.rust-lang.org/book/ch19-04-advanced-types.html#dynamically-sized-types-and-the-sized-trait>
   = note: required by `std::vec::Vec`
Vec<Pin<Box<dyn Future<Output=()>>>>我必须声明强制我将函数结果包装到的类型requests.push(Pin::from(Box::new(request(i))));
use futures::future::join_all;
use std::future::Future;
use std::pin::Pin;
async fn request(n: i32) {
    println!("Started: {}", n);
    let response = reqwest::get("https://www.rust-lang.org")
        .unwrap()
        .text()
        .unwrap();
    println!("Completed: {}. Response: {}", n, &response[0..10]);
}
async fn main() {
    let mut requests: Vec<dyn Future<Output = ()>> = Vec::new();
    for i in 0..5 {
        requests.push(request(i));
    }
    join_all(requests).await;
}
应该是哪一种类型呢?
来自RFC:
异步函数的返回类型是编译器生成的唯一匿名类型,类似于闭包的类型。您可以将这种类型视为一个枚举,函数的每个“屈服点”都有一个变体 - 它的开头、await 表达式和每个返回。每个变体都存储从该屈服点恢复控制所需的状态。
调用该函数时,该匿名类型以其初始状态返回,其中包含该函数的所有参数。
您无法显式声明 future 的具体类型,因为它是匿名类型。作为一个 API 用户,我们只需要知道它实现了,std::futures::Future但这并不意味着我们不需要更深入地了解这个匿名类型及其实现,如果能够掌握这个概念那就太好了。
CLion 将向量类型确定为
Vec<dyn Future<Output = ()>>
这是一个类型提示,而不是实际类型,因为编译器无法知道 的大小dyn Future<Output = ()>,因此不会对其进行编译。
Pin<Box<_>>-ing aFuture来声明显式类型可能不是一个好主意。在您的情况下,不需要它,因为返回的具体类型async fn是相同的。让编译器推断类型就可以了。
也可以看看:
| 归档时间: | 
 | 
| 查看次数: | 10716 次 | 
| 最近记录: |