【发布时间】:2020-03-04 19:54:39
【问题描述】:
存储期货的向量应该使用什么类型?
我尝试在同一个 URL 上发出多个并发请求,并将所有未来保存到向量中以与 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;
}
应该是哪种类型?
【问题讨论】:
-
Vec<dyn Future<Output=()>>不是有效类型,因为它的大小在编译时是未知的。它是表示从async fn request(n: i32) {}返回的不透明类型的类型提示。如果它显示为Vec<impl Future<Output=()>>,这可能是一个更好的选择,但这仍然不是一个有效的类型。将此类型视为实现Future<Output=()>的T。此外,除非您的不透明类型不同,否则您不需要 Pin Box 您的期货:请see -
所以如果你仍然想明确声明类型,你至少可以做到
let mut requests:Vec<_> = Vec::new(); -
我还是不明白,如果我没有显式声明一个值类型,如何让 Rust 识别它?为什么我写不出来?
-
"async/.await 是 Rust 的内置工具,用于编写看起来像同步代码的异步函数。async 将代码块转换为状态机,该状态机实现了一个名为未来"(请参阅:async await primer)
-
抱歉,我看了三遍以上,还是没看懂。 Rust 将异步块转换为状态机,但它的状态机围绕某个结构工作,它的结构可以是某种类型,可以设置为变量。或者它只是一种生锈的魔法,我不在乎这个,因为我不能用它做一些?我能做的最好的事情就是让 Rust 处理变量类型。
标签: asynchronous rust future