2个版本
0.5.1 | 2023年11月22日 |
---|---|
0.5.0 | 2021年12月11日 |
#800 在 数据结构
46 每月下载量
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
,因为当输入超出输出范围时,其正确输出并不立即明确。