rust - 为什么对 usize 数字的减法运算不能为负数,Rust 惯用的处理方式是什么?
问题描述
s
并且t
是向量。如果我们这样做:
t.len() - s.len()
attempt to subtract with overflow
如果减法结果为负数,则可能会导致错误(因为两种类型都是usize
)。
但是,如果我们不知道这两种类型都是usize
,并且我们期望结果可能是负数,它可能会导致一个棘手的错误(我自己也遇到过,并且只在运行时在边缘情况下捕获它)。为了修复这个错误,我将它们转换为:
t.len() as i32 - s.len() as i32
我的问题是:
- 为什么 Rust 不将
usize
减法转换为有符号类型? - 在编译时早期捕获此类错误的 Rust 惯用方法是什么?
解决方案
我不知道,idiomatic way
但我相信usize::checked_sub或usize::overflowing_sub可能是好的解决方案。
所以最后它可能看起来像:
match t.len().checked_sub(s.len()) {
None => println!("Error"),
Some(diff) => println!("Difference is {}", diff),
}
推荐阅读
- reactjs - 如何修复背景颜色单元测试
- dart - 如何为包含子字符串的字符串创建匹配器,同时忽略大小写
- python - 如何将一定长度的数字转换为字符串列表?
- r - 如何正确使用separate_rows
- python - 标记在 seaborn 图中不可见
- javascript - 用不区分大小写模式的 JS/TS 中的粗体标记替换所有匹配的查询(搜索参数)
- ios - LIBGDX 游戏的 iOS 端口中的所有图像资源都需要是 2 的倍数吗?
- python - 将一到二的 xy 数据划分为顶部和底部集
- sql - 在 pyspark 中的位置/过滤
- forms - Xamarin.Forms 帮助直接从 viewmodel 从 Url/Uri 加载图像