Rust 表达式x.await的语义是什么?

Rust 表达式x.await的语义是什么?,rust,async-await,Rust,Async Await,我很好奇.await在锈迹中究竟是如何工作的。它似乎不是未来API的一部分,所以我假设它一定是某种编译器魔法。.await如何工作以及它可以应用于什么 我了解异步构造是如何工作的,以及异步函数是如何使用不稳定的生成器编译的;这不是我的问题。我特别询问.wait魔术会员操作符。也就是说,如果我们有这样一个表达式 fut.await 在这一点上发生了什么?为了使该表达式有效,fut应该满足哪些约束条件 .await是,因此询问它是如何定义的等同于询问是否定义了或匹配。真正的答案并不令人满意:看看

我很好奇
.await
在锈迹中究竟是如何工作的。它似乎不是
未来
API的一部分,所以我假设它一定是某种编译器魔法。
.await
如何工作以及它可以应用于什么

我了解异步构造是如何工作的,以及异步函数是如何使用不稳定的生成器编译的;这不是我的问题。我特别询问
.wait
魔术会员操作符。也就是说,如果我们有这样一个表达式

fut.await
在这一点上发生了什么?为了使该表达式有效,
fut
应该满足哪些约束条件

.await
是,因此询问它是如何定义的等同于询问
是否定义了
匹配
。真正的答案并不令人满意:看看

报告将其描述为:

等待编译器内置
一个名为
wait的内置程序被添加到编译器中<代码>等待可用于
“暂停”未来的计算,将控制权交还给调用者。
等待
将实现
的任何表达式带入Future
,并计算为 该future具有的项目类型的值

//未来:impl未来
让我们等待吧!(未来);
Wait的扩展会反复调用它所接收的未来的轮询, 当函数返回
Poll::Pending
和 当返回
Poll::Ready
时,最终计算为项值

等待只能在异步函数、闭包或块内部使用。
在该上下文之外使用它是一个错误

await!
是一个内置的编译器,为确定其确切语法留出空间 稍后。请参阅未解决问题部分中的更多信息。)

等待的扩展
等待内置大致扩展为:

让mut future=intoufuture::intoufuture($expression);
让mut pin=unsafe{pin::new_unchecked(&mut future)};
环路{
匹配未来::轮询(Pin::借用(&mut Pin)、&mut ctx){
轮询::就绪(项目)=>中断项目,
Poll::Pending=>yield,
}
}
这不是字面上的扩展,因为不能使用
yield
概念 用
async
函数中的表面语法表示。这就是为什么等待 是编译器内置的,而不是实际的宏

注意语法
wait!(表达式)
是要
表达式。在稳定前等待

编译器是否拥有关于
未来
特性的神奇知识

是的

x
可以是将来实现
的任何东西吗
还是更复杂

标准库中实际上没有一个
IntoFuture
;我假设在实现过程中不需要间接级别
.await
仅适用于实现
Future
的类型

另见:


基本上
异步fn
被编译成状态机。请参阅Tyler Mandry的博客文章和。语法让我们认为它是一个变量成员,但实际上,它相当于其他语言中的
wait{expression}
。@如果我的问题有效,Shepmaster表示歉意。我同意它有点宽泛,但它基本上可以归结为表达式
x.await
的语义。如果您认为这样做不合适,我很乐意将我的问题转移到别处
wait
是一个关键字。它不是会员。表达式需要实现
std
中的
Future
特征,这是一个lang项,即编译器知道它。更多详情请参阅。谢谢您的详细回答。我只剩下一个谜题:对象
x
上使用的
.wait
关键字的有效性。编译器是否具有关于
未来
特性的神奇知识,并且
x
可以是实现
未来
的任何东西,还是更复杂?另外,由于您似乎对编译器非常了解,请您指点我应该在编译器代码中查找的位置,好吗?