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的future 版本中实施?

推荐答案

rust 迹斑斑的整体类型有很多:

  • i8i16i32i64i128
  • u8u16u32u64u128
  • isize,
  • usize

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

  • 如果x < y
  • 如果x < y
  • 如果是x < yu<x>总是可以转换成i<y>.

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

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

因此,由于Rust并不热衷于溢出或下溢,因此不太可能实现arbitrary个混合算法或比较.

可以实现一个受限子集,但随后提出了两个问题:

  • 一个受限子集不是无能的吗?
  • 使用混合类型不是设计问题的标志吗?和数量应该有单位一样,数量应该有known magnitude.

Rust相关问答推荐

有条件默认实现

在Tauri中获取ICoreWebView 2_7以打印PDF

当一个箱子有自己的依赖关系时,两个人如何克服S每箱1库+n箱的限制?

关于如何初始化弱 struct 字段的语法问题

如何go 除铁 rust 中路径组件的第一项和最后一项?

一种随机局部搜索算法的基准(分数)

关于使用平面图功能的borrow 判断器的问题

是否可以使用Serde/Rust全局处理无效的JSON值?

在为第三方 struct 实现第三方特征时避免包装器的任何方法

decltype、dyn、impl traits,重构时如何声明函数的返回类型

Rust Redis 中的 HSET 命令问题

Rust 中的自动取消引用是如何工作的?

Rust Serde 为 Option:: 创建反序列化器

预期的整数,找到 `&{integer}`

将数据序列化为 struct 模型,其中两个字段的数据是根据 struct 中的其他字段计算的

如何将 while 循环内的用户输入添加到 Rust 中的向量?

如何制作具有关联类型的特征的类型擦除版本?

如果返回类型是通用的,我可以返回 &str 输入的一部分吗?

如何在 Rust 的泛型函​​数中同时使用非拥有迭代器和消费迭代器?

为什么 u64::trailing_zeros() 在无分支工作时生成分支程序集?