异步 fn 中的 Rust 递归

问题描述 投票:0回答:1

我想在异步 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}
类型时使用的循环 我应该做什么来修复它?

asynchronous recursion rust
1个回答
3
投票

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
,而不是两者兼而有之。

© www.soinside.com 2019 - 2024. All rights reserved.