#math-expressions #proc-macro #changing #instance #api #behavior #wrapping-add

overflow

用于更改数学表达式溢出行为的进程宏

1 个不稳定版本

0.1.0 2019年7月2日

#6#changing

MIT 许可证

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