#递归 #异步 #函数 # #发送 #fn #u32

async-recursion2

异步函数的递归

1个稳定版本

1.0.5 2023年12月28日

#40#fn


2 个crate中使用了(通过 pan_bindings

MIT/Apache

20KB
292

async-recursion 宏

Latest version crates.io downloads Build Status Apache/MIT2.0 License

用于递归异步函数的过程宏。

动机

考虑以下斐波那契数的递归实现

async fn fib(n : u32) -> u32 {
   match n {
       0 | 1 => 1,
       _ => fib(n-1).await + fib(n-2).await
   }
}

编译器会友好地告诉我们

error[E0733]: recursion in an `async fn` requires boxing
 --> src/main.rs:1:26
  |
1 | async fn fib(n : u32) -> u32 {
  |                          ^^^ recursive `async fn`
  |
  = note: a recursive `async fn` must be rewritten to return a boxed `dyn Future`
  = note: consider using the `async_recursion` crate: https://crates.io/crates/async_recursion

此crate提供了一个属性宏,可以自动将异步函数转换为返回boxed Future的函数。

示例

use async_recursion::async_recursion;

#[async_recursion]
async fn fib(n : u32) -> u32 {
   match n {
      0 | 1 => 1,
      _ => fib(n-1).await + fib(n-2).await
   }
}

?Send 选项

返回的未来有一个Send约束,以确保它可以在线程之间发送。如果这不可取,可以像这样标记约束应该被省略

#[async_recursion(?Send)]
async fn example() {
   // ...
}

详细说明

  • #[async_recursion]修改您的函数以返回一个BoxFuture,并且
  • #[async_recursion(?Send)]修改您的函数以返回一个LocalBoxFuture

许可证

根据您的选择,受以下任一许可证的许可

依赖关系

~265–710KB
~17K SLoC