Rust 类型推断选择了错误的超级特征

Rust 类型推断选择了错误的超级特征,rust,type-inference,Rust,Type Inference,此代码: trait Foo: PartialOrd + PartialOrd<<Self as Foo>::A> { type A; } trait Bar { type B: Foo; fn bar(&self) -> Self::B; } fn baz<T: Bar>(x: T, y: T) -> bool { x.bar() < y.bar() } trait Foo:PartialOr

此代码:

trait Foo: PartialOrd + PartialOrd<<Self as Foo>::A> {
    type A;
}

trait Bar {
    type B: Foo;

    fn bar(&self) -> Self::B;
}

fn baz<T: Bar>(x: T, y: T) -> bool {
    x.bar() < y.bar()
}
trait Foo:PartialOrd+PartialOrd{
A型;
}
特征条{
B型:Foo;
fn条(&self)->self::B;
}
fn-baz(x:T,y:T)->bool{
x、 bar()
无法编译,出现以下错误:

错误[E0308]:类型不匹配
-->src/lib.rs:12:15
|
12 | x.bar()
这似乎意味着类型推断试图调用
B:PartialOrd
impl,而不是
B:PartialOrd
impl,后者也可用

这是一个bug还是Rust类型推断的(有意/无意)限制

有没有比这更好的解决方法:

<T::B as PartialOrd>::partial_cmp(&x.bar(), &y.bar()) == Some(Ordering::Less)
::partial_cmp(&x.bar(),&y.bar())==Some(排序::Less)

如果可能的话,推理似乎更喜欢一个更具体的特征,如果是相反的话,它会和你的思维一样混乱case@AlexLarionov:嗯,它也可以没有首选项,只需选择一个有效的;)@马蒂厄姆。看起来它只是选择了最正确的一个:^^@ÖmerErden我想“类型推断选择正确的超级特征”也应该是这个问题的合适标题;)使用(
-Z chalk
标志在1.44-nightly上),这实际上是可以接受的!这不是任何形式的保证,但它给了我希望,这可能正在进行中。