4个版本
0.1.3 | 2020年10月1日 |
---|---|
0.1.2 | 2020年9月30日 |
0.1.1 | 2020年9月30日 |
0.1.0 | 2020年9月30日 |
#819 in 过程宏
每月21次下载
10KB
95 行
描述
此Crate提供了一种过程宏,可以将算术运算符 +,-,*
以及它们的赋值版本 +=,-=,*=
重写为其饱和等效版本 saturating_add, saturating_sub, saturating_mul
。例如,这对于快速 安全 旧代码很有用,如果你能接受由此检查带来的性能惩罚。
链接
内容
示例
以下函数
#[saturateit]
fn mix(a: u32, b: u32, c: &[u32]) -> u32 {
let mut r = a + b;
for u in c {
r *= u;
}
r
}
被重写为
fn mix(a: u32, b: u32, c: &[u32]) -> u32 {
let mut r = a.saturating_add(b);
for u in c {
r = r.saturating_mul(u);
}
r
}
安装
在您的 Cargo.toml
中的 [dependencies]
添加
[dependencies]
saturating_arithmetic = "0.1"
# If you want this to work on your own types, you'll need this crate too:
num-traits = "0.2"
然后,在您的入口点(main.rs
或 lib.rs
)中添加
extern crate saturating_arithmetic;
extern crate num_traits;
然后在您的代码中使用它们。
use saturating_arithmetic::saturateit;
use num_traits::{SaturatingAdd, SaturatingMul, SaturatingSub};
用法
在函数体上方添加 #[saturateit]
。
#[saturateit]
fn lmao_jeff() {
4 + 4;
}
您可以使用类似 cargo expand 的工具来检查宏是否真正起作用。
fn lmao_jeff() {
4.saturating_add(4);
}
警告
如果您也在使用特性,您可能会看到关于必须借用操作符右侧的警告,因为根据特性的函数签名是 saturating_add(&self, rhs: &Self) -> Self
。
根据我的经验,您可以忽略这些。
免责声明
我从wrapping_arithmetic中分叉了这个项目,因为有点需要它。我对这个实际上是如何工作的没有头绪,除了过程宏魔法和那些庞大的依赖确实做了些什么。您可以自由地创建一个Issue或PR,但我无法保证我能帮到您。
待办事项
总的来说,整个项目需要重做,使其更像overflower,但需要积极维护,并且没有任何夜间功能。我对整个特性问题也很不满意,肯定有办法让这一切都能可靠地工作。当然。
依赖项
~1.5MB
~36K SLoC