为什么有符号整数的绝对值方法不返回无符号值?

Joh*_*tte 10 rust

以下代码无法编译:

fn main() {
    let x = (-5i32).abs();

    let z: u32 = x;
}
Run Code Online (Sandbox Code Playgroud)

随着消息:

error[E0308]: mismatched types
 --> src/main.rs:4:18
  |
4 |     let z: u32 = x;
  |                  ^ expected u32, found i32
Run Code Online (Sandbox Code Playgroud)

阅读文档,它看起来选择i32源于i32::min_value()没有积极表现的事实i32.然而,这有积极的表现u32,可以两次表示数字大.

我正在学习这门语言,并想了解为什么做出某些设计决定,以便养成良好的习惯.我觉得这个令人困惑.有人可以解释为什么它以这种方式工作而不是只返回一个u32,这似乎是语义上正确的类型?

Joh*_*tte 11

有一个指向开发会议记录的链接,在建议的RFC"更改abs()中讨论了这一点,以返回无符号整数"

看起来主要原因是:

  1. 许多其他语言使用i32- > i32(例如,C,Java),因为意外推广其他值u32可能会导致错误.Rust似乎原来使用了i32- > i32因为这个原因(即遵循惯例),但没有遭受同样的错误.
  2. 在Rust达到测试版之后才提交此功能请求.开发人员不愿意对语言进行重大修改而不是看似罕见的错误.这似乎是保持这种方式的主要原因.

似乎接受的解决方法是使用as u32强制转换.

i32::overflowing_abs i32::wrapping_absi32::checked_abs实现其他解决方案i32::min_value(),但没有一个生成u32.