1 个不稳定版本
0.1.0 | 2022年4月6日 |
---|
#2044 in 数据结构
55KB
664 行
Unrecurse
从您的 Rust 代码中去除递归。
许可证
MIT
lib.rs
:
Unrecurse
此处于原型状态 根据作者所知,总体思路是可行的,甚至通过了 miri。但内部和公开 API 中仍有许多粗糙边缘。
将递归方法转换为迭代的辅助工具。
此 crate 包含以下主要部分。
RefStack
结构,用于直接和细粒度访问栈。但现在只支持引用。- [
run
] 能够存储引用栈中前一个元素的 struct。 run_async
重新编写异步递归,而不需要递归/宏/分配每个 futurerun_async_backref
如果您的异步递归中当前栈帧包含对前一个栈帧的引用
最简单的方法是使用 run_async(_backref)
。您可以将当前的递归函数转换为 async fn。添加 Recursion
/RecursionContext
参数。使用它来调用递归,搞定。它仍然看起来像递归,因此仍然容易推理,但内部它使用异步机制来按顺序执行一切,使用为当前状态分配的专用栈。但当前 Rust 中的 futures 优化得并不是很好。所以如果生成的 future 过大,您可能需要求助于 run
函数,该函数允许您创建自己的状态以存储在内部栈中。
MSRV: 1.60
依赖关系
~1MB
~15K SLoC