15个版本 (8个稳定版)

1.1.1 2024年4月25日
1.1.0 2024年3月17日
1.0.5 2023年9月2日
1.0.4 2023年3月18日
0.1.2 2019年10月4日

异步 中排名 #37

Download history 362462/week @ 2024-05-03 389016/week @ 2024-05-10 393568/week @ 2024-05-17 382843/week @ 2024-05-24 412623/week @ 2024-05-31 402356/week @ 2024-06-07 397722/week @ 2024-06-14 417649/week @ 2024-06-21 396555/week @ 2024-06-28 392995/week @ 2024-07-05 409180/week @ 2024-07-12 395369/week @ 2024-07-19 397148/week @ 2024-07-26 386338/week @ 2024-08-02 422258/week @ 2024-08-09 436490/week @ 2024-08-16

每月 1,721,553 次下载
1,581 个 Crates 中使用 (484 个直接使用)

MIT/Apache

18KB
243

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 选项

返回的 Future 具有绑定 Send 以确保它可以在线程之间发送。如果这不可取,可以标记为省略该绑定,如下所示

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

Sync 选项

返回的 Future 没有绑定 Sync,因为这通常不是必需的。可以按照以下方式包含 Sync 绑定

#[async_recursion(Sync)]
async fn returned_future_is_sync() {
   // ...
}

详细说明

  • #[async_recursion] 修改您的函数以返回带有 Send 绑定的boxed Future
  • #[async_recursion(?Send)] 修改您的函数以返回没有 Send 绑定的boxed Future
  • #[async_recursion(Sync)] 修改您的函数以返回一个带有 Future 的盒子,并带有 SendSync 绑定。

许可证

许可协议为以下之一

由您选择。

依赖项

~255–700KB
~17K SLoC