我想在异步FN中使用递归,就像:

async fn test(data: i32) -> i32 {
    if data == 0 {
        0
    } else {
        test(data - 1).await
    }
}

但它说,async fn中的递归需要拳击.

所以我把它改成这样:

async fn test(data: i32) -> BoxFuture<'static, i32> {
    async move {
        if data == 0 {
            0
        } else {
            test(data - 1).await.await
        }
    }
    .boxed()
}

但它再次编译错误,并显示消息:计算类型为test::{opaque#0}时使用周期 我应该做些什么来修复它呢?

推荐答案

async或多或少是返回Future的语法糖,因为你已经返回了一个,只要把async从你的定义中go 掉,它就不再需要了:

use futures::{FutureExt, future::BoxFuture};
fn test(data: i32) -> BoxFuture<'static, i32> {
    if data == 0 {
        async { 0 }.boxed()
    } else {
        test(data - 1)
    }
}

根据经验,一个函数应该要么是async,要么返回T: Future,而不是两者都是.

Rust相关问答推荐

如何在Rust中为具有多个数据持有者的enum变体编写文档 comments ?

阻止websocket中断的中断中断的终端(操作系统错误4)

将JSON密钥转换为Polars DataFrame

如何从铁 rust 中呼唤_mm_256_mul_ph?

原始数组数据类型的默认trait实现

Pin<;&;mut可能将Uninit<;T>;>;合并为Pin<;&;mut T>;

在本例中,为什么我不能一次多次borrow 可变变量?

如果死 struct 实现了/派生了一些特征,为什么Rust会停止检测它们?

根据填充系数以相对大小在给定空间中布局项目

为什么AsyncRead在Box上的实现有一个Unpin特征绑定?

UnsafeCell:它如何通知 rustc Select 退出基于别名的优化?

实现泛型的 Trait 方法中的文字

如何将 Rust 字符串转换为 i8(c_char) 数组?

判断对象是 PyDatetime 还是 Pydate 的实例?

为什么传递 option.as_ref 的行为不同于使用匹配块并将内部映射到 ref 自己?

Rust 中的let是做什么的?

在单独的线程上运行 actix web 服务器

有没有更好的方法来为拥有 DIsplay 事物集合的 struct 实现 Display?

需要括号的宏调用中的不必要的括号警告 - 这是编写宏的糟糕方法吗?

为什么这个 Trait 无效?以及改用什么签名?