为何对模糊数值类型调用方法会报错?Rust类型推断疑问
为什么
(-100).abs()会报类型歧义错误? 核心原因是:-100不是一个单独的字面量,而是一元负号运算符作用于字面量100的表达式。
Rust官方文档里说的「无后缀字面量默认i32」,针对的是像100这种独立的数值字面量。但当你写-100时,编译器会把它解析为-(一元负号)操作符应用到100上,这时候情况就变了:
- 一元负号可以作用于所有有符号整数类型(i8、i16、i32、i64等)
- 而
abs()方法同样在所有有符号整数类型上都有实现
这就导致编译器陷入两难:它没法从abs()调用里推断出(-100)应该是哪种具体的有符号整数类型——毕竟每个类型都有abs(),没有足够的上下文约束来锁定到i32,所以就抛出了类型歧义的错误。
解决起来也简单,只要给编译器足够的类型提示就行:
- 直接给变量指定类型:
let i: i32 = (-100).abs(); - 或者给字面量加后缀明确类型:
let i = (-100i32).abs();
对比一下,如果你写let i = 100.abs();就不会报错,因为100作为独立字面量默认是i32,调用abs()自然就对应i32的方法,没有歧义。
内容的提问来源于stack exchange,提问作者Hiroto Kagotani
相关产品推荐
相关产品推荐

