我应该使用什么类型的向量来存储 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 a Future
声明显式类型可能不是一个好主意。在您的情况下,不需要它,因为返回的具体类型async fn
是相同的。让编译器推断类型就可以了。
也可以看看:
- 对于各种具体返回类型:如何将异步函数放入 Rust 的映射中?
- 静态和动态调度:特质对象
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)