以下代码无法编译:
fn main() {
let x = (-5i32).abs();
let z: u32 = x;
}
带有消息:
error[E0308]: mismatched types
--> src/main.rs:4:18
|
4 | let z: u32 = x;
| ^ expected u32, found i32
Reading 文档 https://doc.rust-lang.org/std/primitive.i32.html#method.abs,看起来选择i32
源于这样一个事实i32::min_value()
没有积极的代表i32
。然而,它would具有积极的代表性u32
,它可以表示两倍大的数字。
我正在学习这门语言,并且想了解为什么做出某些设计决策,以便我可以养成良好的习惯。我觉得这很令人困惑。有人可以解释为什么它以这种方式工作而不是仅仅返回一个u32
,这似乎是语义上正确的类型?
有一个链接开发会议纪要 https://github.com/rust-lang/meeting-minutes/blob/master/weekly-meetings/2015-04-07.md#change-abs-to-return-unsigned中对此进行了讨论提议的 RFC“更改 abs() 以返回无符号整数” https://github.com/rust-lang/rfcs/pull/1017
看起来主要原因是:
- 许多其他语言都使用
i32
-> i32
(例如,C、Java),因为意外将其他值提升为u32
可能会导致错误。 Rust好像用过i32
-> i32
最初出于这个原因(即遵循约定),但不会遭受相同类型的错误。
- 该功能请求直到 Rust 达到测试版后才提交。开发人员不愿意因为一个罕见的错误而对语言进行重大更改。这看起来是保持这种方式的主要原因。
似乎公认的解决方法是使用as u32
来投射。
i32::overflowing_abs
i32::wrapping_abs
and i32::checked_abs
实施其他解决方案i32::min_value()
bug,但它们都不会产生 u32。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)