为何Rust中‘impl Trait’语法在双参数场景下无法生效?
Rust中
impl PartialOrd参数编译失败的原因 问题代码
fn main(){ let x: i32 = 5; let y: i32 = 6; dbg!(greater_than(&x, &y)); } fn greater_than(x: &impl PartialOrd, y: &impl PartialOrd) -> bool{ x > y }
编译错误信息
error[E0308]: mismatched types --> src/main.rs:8:9 | 7 | fn greater_than(x: &impl PartialOrd, y: &impl PartialOrd) -> bool{ | --------------- --------------- found type parameter | | | expected type parameter 8 | x > y | ^ expected type parameter `impl PartialOrd`, found a different type parameter `impl PartialOrd` | = note: expected reference `&impl PartialOrd` (type parameter `impl PartialOrd`) found reference `&impl PartialOrd` (type parameter `impl PartialOrd`) = note: a type parameter was expected, but a different one was found; you might be missing a type parameter or trait bound = note: for more information, visit https://doc.rust-lang.org/book/ch10-02-traits.html#traits-as-parameters
疑问
原本以为impl trait语法能接受任何实现该trait的类型(i32已实现PartialOrd),但改用泛型trait bound的签名fn greater_than<T: PartialOrd>(x: &T, y: &T) -> bool却能正常编译,这是什么原因?
原因解析
&impl PartialOrd的本质:
函数签名里的每个&impl PartialOrd都是独立的匿名类型参数——x可以是任意实现PartialOrd的类型的引用,y也可以是任意实现PartialOrd的类型的引用,但这两个类型完全可以不相同。PartialOrd的类型约束:
PartialOrdtrait的核心方法partial_cmp要求比较的两个值必须是同类型的(定义为fn partial_cmp(&self, other: &Self) -> Option<Ordering>,其中other的类型是Self,即和调用者同类型)。>操作符是这个方法的语法糖,自然继承了这个约束。两种写法的差异:
- 用
&impl PartialOrd时,Rust无法确定x和y的类型是否一致,因此认为x > y违反了类型约束,编译失败。 - 用泛型签名
fn greater_than<T: PartialOrd>(x: &T, y: &T) -> bool时,你明确指定了x和y都是同一类型T的引用,且T实现PartialOrd,完全符合PartialOrd对操作数类型的要求,所以能正常编译。
- 用
内容的提问来源于stack exchange,提问作者DammyD
相关产品推荐
相关产品推荐

