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
没有为不同类型的整数实现。 f32
和f64
以及PartialOrd
之间也是如此。这有什么理由吗?它是否打算在Rust的未来版本中实现?
答案 0 :(得分:4)
Rust中有许多整数类型:
i8
,i16
,i32
,i64
和i128
,u8
,u16
,u32
,u64
和u128
,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
isize
和usize
在任何地方都有特定于平台的大小,小到16位但大到64位。因此,由于Rust不热衷于溢出或下溢,因此不可能实现任意混合算术或比较。
可以实施受限制的子集,但随后会提出两个问题:
答案 1 :(得分:3)
预期的行为 - Rust是一种强类型语言,它不会在不同类型的整数之间执行隐式转换。
我认为未来这种情况不会发生变化,因为它可能是臭名昭着的臭名昭着的潜在根源。
你需要明确并注意potential caveats of numeric casts(截断等):
let x: i32 = 4;
let y: i16 = 4;
println!("{}", x == y as i32);