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