2个版本

0.5.1 2023年11月22日
0.5.0 2021年12月11日

#800数据结构

46 每月下载量

MIT 许可证

12KB
152

truncate-integer: Rust的整数截断

在Rust中,可能有几种整数截断的方式

  • 未检查:截断可能导致值改变。您只能得到低阶N位。
  • 已检查:如果截断会导致值改变,则返回 None,否则返回 Some(value)
  • 恐慌:如果截断会导致值改变,则 'panic!'。这与使用 .unwrap() 的已检查截断等效,但有一个更友好的恐慌信息。
  • 饱和:如果截断会导致值改变,则返回目标类型能够容纳的最大值。

在Rust中,您可以在不导入额外的crate或编写大量代码的情况下获得所有这些,例如

let x = 257u16;

let unchecked = x as u8;
assert_eq!(unchecked, 1u8);

let checked = u8::try_from(x);
assert!(checked.is_err());

// This would panic
// let value = x.try_from().unwrap();

let saturating = u8::try_from(x).unwrap_or(u8::MAX);
assert_eq!(saturating, 255);

如果您觉得这些足够好了,那么您可能不需要这个crate。然而,如果您希望通过调用函数来传达您的意图,那么您可能会发现这个crate很有用。

它提供了一个trait,实现了上面列出的每种截断形式

  • TruncateUnchecked 执行未检查的截断。
  • TryTruncate 执行已检查的截断。
  • Chop 执行恐慌截断。
  • Shrink 执行饱和截断。

有时需要反转这种逻辑,例如在trait界限中,因此每个上述方法都有一个逆操作

  • TruncateFromUnchecked
  • TryTruncateFrom
  • ChopFrom
  • ShrinkFrom

所有截断都适用于有符号和无符号整数(包括有符号到无符号和反之亦然),除了 TruncateFromUnchecked,因为当输入超出输出范围时,其正确输出并不立即明确。

无运行时依赖