我想在异步 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
即可,不再需要它了:
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
,而不是两者兼而有之。