为什么我不能比较不同类型的两个整数?

时间:2018-01-12 11:41:53

标签: rust comparison

let x: i32 = 4;
let y: i16 = 4;

println!("{}", x == y);

编译上面的代码片段时,编译器会输出以下错误:

error[E0308]: mismatched types
 --> src/main.rs:5:25
  |
5 |     println!("{}", x == y);
  |                         ^ expected i32, found i16

似乎PartialEq没有为不同类型的整数实现。 f32f64以及PartialOrd之间也是如此。这有什么理由吗?它是否打算在Rust的未来版本中实现?

2 个答案:

答案 0 :(得分:4)

Rust中有许多整数类型:

  • i8i16i32i64i128
  • u8u16u32u64u128
  • isize
  • usize

在某些情况下,混合算术或比较会有明显的实现,因为可以在一个方向进行无损转换:

    如果i<x>,,
  • i<y>始终可以转换为x < y 如果u<x>
  • u<y>始终可以转换为x < y 如果u<x>
  • i<y>始终可以转换为x < y

然而,有些转换并不明显或不可移植:

    无论i<x>u<y>各自的值是什么,
  • x都无法转换为y
  • isizeusize在任何地方都有特定于平台的大小,小到16位但大到64位。

因此,由于Rust不热衷于溢出或下溢,因此不可能实现任意混合算术或比较。

可以实施受限制的子集,但随后会提出两个问题:

  • 不受限制的子集是否符合人体工程学?
  • 不是使用混合类型设计问题的标志吗?同样,数量应具有单位,数量应该具有已知量值

答案 1 :(得分:3)

预期的行为 - Rust是一种强类型语言,它不会在不同类型的整数之间执行隐式转换。

我认为未来这种情况不会发生变化,因为它可能是臭名昭着的臭名昭着的潜在根源。

你需要明确并注意potential caveats of numeric casts(截断等):

let x: i32 = 4;
let y: i16 = 4;

println!("{}", x == y as i32);