let x: i32 = 4;
let y: i16 = 4;
println!("{}", x == y);
Run Code Online (Sandbox Code Playgroud)
编译上面的代码片段时,编译器将显示以下错误:
let x: i32 = 4;
let y: i16 = 4;
println!("{}", x == y);
Run Code Online (Sandbox Code Playgroud)
似乎PartialEq
没有为不同类型的整数实现。f32
和f64
,和之间也发生相同的情况PartialOrd
。有什么理由吗?是否打算在Rust的未来版本中实现?
这是预期的行为 - Rust 是一种强类型语言,它不会在不同类型的整数之间执行隐式转换。
我认为这在未来不会改变,因为这将成为众所周知难以找到的错误的潜在来源。
let x: i32 = 4;
let y: i16 = 4;
println!("{}", x == y as i32);
Run Code Online (Sandbox Code Playgroud)
Rust中有很多整数类型:
i8
,i16
,i32
,i64
和i128
,u8
,u16
,u32
,u64
和u128
,isize
,usize
。在某些情况下,混合算术或比较将具有明显的实现方式,因为可以在一个方向上进行无损转换:
i<x>
可以始终转换为i<y>
if x < y
,u<x>
可以始终转换为u<y>
if x < y
,u<x>
可以始终转换为i<y>
if x < y
。但是,某些转换并不明显或无法移植:
i<x>
u<y>
无论x
and y
分别是什么值,都无法转换为isize
并且usize
在任何地方都有特定于平台的大小,可小至16位,大至64位。因此,由于Rust并不热衷于上溢或下溢,因此不太可能实施任意混合算术或比较。
可以实现一个受限制的子集,但随后提出了两个问题: