Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asynchronous 从'async fn'返回的future的具体类型是什么?_Asynchronous_Rust_Future - Fatal编程技术网

Asynchronous 从'async fn'返回的future的具体类型是什么?

Asynchronous 从'async fn'返回的future的具体类型是什么?,asynchronous,rust,future,Asynchronous,Rust,Future,存储未来的向量应该使用哪种类型 我试图在同一个URL上发出多个并发请求,并将所有未来保存到向量中,以便与join\u all一起使用 如果我没有显式地为向量设置类型,那么一切都可以正常工作。我知道Rust可以找到合适的变量类型。CLion将向量类型确定为Vec,但当我尝试自己设置类型时,它会给我一个错误: error[E0277]:编译时无法知道'dyn core::future::future::future'类型的值的大小 -->src/lib.rs:15:23 | 15 |让mut请求:V

存储未来的向量应该使用哪种类型

我试图在同一个URL上发出多个并发请求,并将所有未来保存到向量中,以便与
join\u all
一起使用

如果我没有显式地为向量设置类型,那么一切都可以正常工作。我知道Rust可以找到合适的变量类型。CLion将向量类型确定为
Vec
,但当我尝试自己设置类型时,它会给我一个错误:

error[E0277]:编译时无法知道'dyn core::future::future::future'类型的值的大小
-->src/lib.rs:15:23
|
15 |让mut请求:Vec=Vec::new();
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^在编译时没有已知的大小
|
=help:trait`std::marker::Sized`未为`dyn core::future::future::future'实现`
=注意:要了解更多信息,请访问
=注:由'std::vec::vec'所需`
我必须将类型声明为
Vec
,这迫使我将函数结果包装到
请求中

use futures::future::join_all;
使用std::future::future;
使用std::pin::pin;
异步fn请求(n:i32){
println!(“开始:{}”,n);
让response=reqwest::get(“https://www.rust-lang.org")
.unwrap()
.text()
.unwrap();
println!((“已完成:{}.Response:{}”,n,&Response[0..10]);
}
异步fn main(){
让mut请求:Vec=Vec::new();
因为我在0..5{
请求。推送(请求(i));
}
加入所有(请求)。等待;
}
应该是哪种类型?

来自:

异步函数的返回类型是编译器生成的唯一匿名类型,类似于闭包类型。您可以将此类型视为类似于枚举的类型,函数的每个“屈服点”都有一个变量—它的开头、等待表达式和每个返回。每个变量存储从该屈服点恢复控制所需的状态

调用该函数时,将在其 初始状态,其中包含此函数的所有参数

不能显式声明future的具体类型,因为它是匿名类型。作为一个API用户,我们只需要知道它实现了
std::futures::Future
,但这并不意味着我们不需要对这种匿名类型及其实现有更深入的了解,掌握这个概念会更好


CLion将向量类型确定为
Vec

这是一个类型提示,而不是实际的类型,因为编译器无法知道未来的
dyn
的大小,所以它将不会被编译


Pin
-使用
Future
声明显式类型可能不是一个好主意。在您的情况下,不需要它,因为从
async fn
返回的具体类型是相同的。让编译器推断类型就可以了

另请参见:

  • 对于各种混凝土返回类型:
  • 静态和动态调度:

Vec
不是有效类型,因为它的大小在编译时未知。它是一个类型提示,表示从
异步fn请求(n:i32){}
返回的不透明类型。如果它像那样显示
Vec
,可能是一个更好的选择,但这仍然不是一个有效的类型。将此类型视为<代码> t>代码>,实现<代码>未来< /代码>。此外,除非不透明类型不同,否则您不需要固定未来:请这样,如果您仍然希望显式声明类型,您至少可以执行
let mut requests:Vec=Vec::new()我仍然不明白,如果我没有显式声明值类型,如何识别它?为什么我不能写它?“async/.await是Rust的内置工具,用于编写类似同步代码的异步函数。async将一块代码转换为一个状态机,该状态机实现了一个名为Future的特性”(请参见:)抱歉,我读了三次以上,但仍然不理解。Rust将异步块转换为状态机,但它是围绕某个结构工作的状态机,并且它的结构可以是某种类型,并且可以设置为变量。或者它只是一种锈菌的魔法,我不在乎这个,因为我不能用它来做什么?我能做的最好的事情就是让Rust处理变量类型。你能举一个例子说明如何在没有
Pin
的情况下声明具体类型吗?@Austraas,正如我在回答中指出的那样;从
async fn
返回的
Future
是匿名类型,由编译器生成,您无法声明,因为您不知道编译器将生成什么。你在处理什么样的情况,如果你给我举个例子,我能帮你吗?