以下代码无法编译:
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()中讨论了这一点,以返回无符号整数"
看起来主要原因是:
i32- > i32(例如,C,Java),因为意外推广其他值u32可能会导致错误.Rust似乎原来使用了i32- > i32因为这个原因(即遵循惯例),但没有遭受同样的错误.似乎接受的解决方法是使用as u32强制转换.
i32::overflowing_abs i32::wrapping_abs并i32::checked_abs实现其他解决方案i32::min_value(),但没有一个生成u32.
| 归档时间: |
|
| 查看次数: |
356 次 |
| 最近记录: |