以下代码无法编译:
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
阅读the documentation时,看来i32
的选择源于i32::min_value()
在i32
中没有正面表示的事实。但是,它在u32
中将具有正表示,可以表示两倍大的数字。
我正在学习语言,并且想了解为什么要做出某些设计决定,以便养成良好的习惯。我发现这令人困惑。有人可以解释为什么这样做而不是仅仅返回u32
,它在语义上是正确的吗?
答案 0 :(得分:10)
有一个指向the development meeting minutes的链接,在proposed RFC "Change abs() to return unsigned integers"
中对此进行了讨论。主要原因似乎是:
i32
-> i32
(例如C,Java),因为其他值意外提升为u32
可能会导致错误。 Rust最初出于这个原因(即遵循惯例)似乎使用了i32
-> i32
,但是并没有遇到相同类型的错误。似乎可以接受的解决方法是使用as u32
进行投射。
i32::overflowing_abs
i32::wrapping_abs
和i32::checked_abs
实现了i32::min_value()
错误的其他解决方案,但没有一个产生u32。