我写了类似下面的代码:
fn foo() {
let x = &1;
let y = 2;
let z: u32 = x * y + 42_u32;
}
我得到一个错误:
error[E0277]: cannot add `u32` to `i32`
--> src/main.rs:11:24
|
11 | let z: u32 = x * y + 42_u32;
| ^ no implementation for `i32 + u32`
|
= help: the trait `std::ops::Add<u32>` is not implemented for `i32`
但是,当我取消引用
x
时,它就可以正常工作。在一些实验中,以下代码也被编译。
let z: u32 = x + y * 42_u32;
let z: u32 = 42_u32 + x + y;
我想知道为什么Rust的类型推断能做到这一点。
类型推断的顺序会受到操作顺序的影响吗?
如果是这样,为什么在这种情况下无法进行类型推断呢?
最佳答案
这是一个known bug,涉及二进制操作(两个操作数),其原始类型位于引用之后。它正在getting fixed的过程中。
关于compiler-errors - 为什么类型推断不适用于引用类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59802504/