首页 > 解决方案 > 为什么有符号整数的绝对值方法不返回无符号值?

问题描述

以下代码无法编译:

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

阅读文档,看起来选择i32源于i32::min_value()没有正面表示的事实i32。但是,它将中具有正表示u32,可以表示两倍大的数字。

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

标签: rust

解决方案


有一个开发会议纪要的链接,在提议的 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。


推荐阅读