1 个不稳定版本
0.1.0 | 2019年7月2日 |
---|
#6 在 #changing
13KB
248 行(不包括注释)
Overflow
一个便利的宏,可以在不更改这些表达式的情况下(大多数情况下)更改数学表达式的溢出属性。
一些背景
默认情况下,Rust的数学表达式(例如,2 * 9)在调试构建时会在运行时失败,在发布构建时静默溢出。虽然这是一个不错的默认设置,但你可能想要不同的行为。例如,整数溢出可能是预期的行为。在这种情况下,你将需要求助于Rust数字可用的各种溢出API(例如,wrapping_mul
)。然而,这个问题是,你将无法再使用正常的数学符号,而需要使用繁琐的方法,如 a.wrapping_add(b)
来代替 a + b
。
Overflow允许你继续使用正常的数学符号,但仍然可以更改处理溢出的方式。
示例
默认情况下,以下代码在调试构建中将失败
(2u8.pow(20) << 20) + 2 * 2;
为了使这段代码在调试和发布构建中都进行包装,你需要这样写
(2u8.wrapping_pow(20).wrapping_shl(20)).wrapping_add(2u8.wrapping_mul(2))
或者你可以使用Overflow,并编写以下代码
overflow::wrapping! { (2u8.pow(20) << 20) + 2u8 * 2 }
上面的代码将直接将正常的表达式语法转换为上面的 wrapping
变体。
限制
Overflow目前在以下方面有限制
- 由于表达式中的进程宏目前尚不稳定,因此该软件包目前需要使用nightly。
- 由于数学运算比方法调用更容易传播类型推断信息,因此在使用宏时可能需要添加以前不需要的类型信息。
- 溢出行为仅受顶层(或括号内)的影响,这意味着如果你在方法调用或其他宏内部有数学表达式,这些表达式将不会被转换。
pow
的转换非常简单,因此如果你在某个类型上调用pow
方法,这将转换为wrapping_pow
,即使这对该类型来说没有意义。
依赖关系
~2MB
~46K SLoC