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
每月 1,721,553 次下载
在 1,581 个 Crates 中使用 (484 个直接使用)
18KB
243 行
async-recursion 宏
用于递归异步函数的过程宏。
- 文档
- Cargo 包: async-recursion
动机
考虑以下斐波那契数的递归实现
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
绑定的boxedFuture
。#[async_recursion(?Send)]
修改您的函数以返回没有Send
绑定的boxedFuture
。#[async_recursion(Sync)]
修改您的函数以返回一个带有Future
的盒子,并带有Send
和Sync
绑定。
许可证
许可协议为以下之一
- Apache License, Version 2.0 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
依赖项
~255–700KB
~17K SLoC