2个版本
0.0.2 | 2023年12月3日 |
---|---|
0.0.1 | 2023年12月3日 |
#624 在 过程宏
15KB
344 行
功能宏
背景
这个 宏
的目的是帮助强制执行 纯函数
。
虽然它确实有一些已知的局限性(见下文),但我们仍然认为它有助于保持 mutation
在控制之下。
它是如何工作的?
- 我们解析每个
函数
参数并检查它们是否是可变的
(&mut
)。 - 我们通过一个内部
模块
重写函数
以防止使用globals
。
原始:
#[pure_functional]
fn foo(arg: i32) -> i32 {
arg + 1
}
重写:
fn foo(arg: i32) -> i32 {
mod inner {
pub fn foo(arg: i32) -> i32 {
arg + 1
}
}
inner::foo(arg)
}
已知局限性
-
任何内部隐藏
mutability
的struct
都不会被此宏
捕获。例如,以下
struct
将不会被此宏
捕获Arc<Mutex<T>>
.Cell<T>
.RefCell<T>
.RwLock<T>
.UnsafeCell<T>
.
所有这些内部都封装了
UnsafeCell<T>
,这就是为什么它们不会被此宏
捕获。 -
不支持
async
函数。 -
不支持
&self
和&mut self
。
依赖项
~0.7–11MB
~68K SLoC