Rust 异步和流的生存期

Rust 异步和流的生存期,rust,async-await,stream,lifetime,rust-2018,Rust,Async Await,Stream,Lifetime,Rust 2018,我试图创建一个函数,该函数使用流,并在出现max\u continuous\u失败continuous失败时将其截断。然而,事情并不顺利(E0495)。我将Streams更改为Iterators(并删除了asyncs),它很简单。为什么会发生这种情况?如何重构此代码(使其工作) use futures::stream::stream; pub fn max_fail impl Stream+'a其中T:'a { 使用futures::stream::StreamText; 让mut连续_失败=0

我试图创建一个函数,该函数使用
,并在出现
max\u continuous\u失败
continuous失败时将其截断。然而,事情并不顺利(E0495)。我将
Stream
s更改为
Iterator
s(并删除了
async
s),它很简单。为什么会发生这种情况?如何重构此代码(使其工作)

use futures::stream::stream;
pub fn max_fail impl Stream+'a其中T:'a
{
使用futures::stream::StreamText;
让mut连续_失败=0;
stream.take_while(move | x | async{
如果x.是某个(){
连续_失败=0;
真的
}
否则{
连续_失败+=1;
连续\u失败!=最大\u连续\u失败
}
})
}
下面是一个最小化的示例,我试图指出问题所在,但仍然无法理解rustc错误消息

use futures::stream::stream;
pub fn小型化_示例impl Stream+'a
{
使用futures::stream::StreamText;
stream.take_while(|x | async{*x})
}
异步块(
Async{…}
)在捕获环境的方式上类似于闭包。默认情况下,来自另一个作用域的变量的每次使用都是通过引用进行的,这意味着由块创建的
impl core::future::future
不能超过它捕获的变量


您需要使用
async move{…}
x
移动到块中(就像闭包一样)

因此
Future
捕获变量,而编译器不够聪明,无法删除不必要的捕获,应该做的是使用单独的异步块显式地分离捕获

use futures::stream::stream;
pub fn max_fail impl Stream+'a
哪里
T:a,
{
使用futures::stream::StreamText;
让mut连续_失败=0;
溪流。稍作休息(移动| x |{
设t=如果x是某(){
连续_失败=0;
真的
}否则{
连续_失败+=1;
连续\u失败!=最大\u连续\u失败
};
返回异步移动{t};
})
}

请不要在问题中包含“谢谢”或类似内容。有关更多说明,请参见此处:,以及此处: