在rust中,整数类型的内置方法的类型推导是如何工作的?



我很困惑Rust是如何推断一个整数的确切类型的。对于内置方法,类型演绎的工作方式似乎与为多个整数实现的特征不同。

例如:

trait Fun {
fn fun(self, other: Self);
}
impl Fun for i64 {
fn fun(self, other: Self){
println!("i64");
}
}
impl Fun for i32 {
fn fun(self, other: Self){
println!("i32");
}
}
impl Fun for u32 {
fn fun(self, other: Self) {
println!("u32");
}
}
fn main() {
0.saturating_add(1); // fails
0i32.saturating_add(1); // ok
0.saturating_add(1i32); // fails
0.fun(1); // ok, i32
0.fun(1u32); // ok, u32
0u32.fun(1); // ok, u32
}

我希望saturating_add能够在所有三种情况下推断出类型,就像fun能够一样。两者的区别在哪里?

不同的是,saturating_add()不是一个trait方法,而是一个固有的方法,你不能在一个模糊的类型上调用固有的方法-类似于<_>::method(value)不使用UFCS(通用函数调用语法)工作。另一方面,fun()是一个trait方法,如果可以推断出Self,你可以不知道它——类似于你可以做<_ as Trait>::method(value)

最新更新