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>无论xand y分别是什么值,都无法转换为isize并且usize在任何地方都有特定于平台的大小,可小至16位,大至64位。因此,由于Rust并不热衷于上溢或下溢,因此不太可能实施任意混合算术或比较。
可以实现一个受限制的子集,但随后提出了两个问题: