1个稳定版本
1.0.5 | 2023年12月28日 |
---|
#40 在 #fn
在 2 个crate中使用了(通过 pan_bindings)
20KB
292 行
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 选项
返回的未来有一个Send
约束,以确保它可以在线程之间发送。如果这不可取,可以像这样标记约束应该被省略
#[async_recursion(?Send)]
async fn example() {
// ...
}
详细说明
#[async_recursion]
修改您的函数以返回一个BoxFuture
,并且#[async_recursion(?Send)]
修改您的函数以返回一个LocalBoxFuture
。
许可证
根据您的选择,受以下任一许可证的许可
- Apache许可证第2版(LICENSE-APACHE 或 http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
。
依赖关系
~265–710KB
~17K SLoC