Вывод типа выбирает неправильный супертрайт - PullRequest
4 голосов
/ 25 мая 2020

Этот код:

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()
}

не удается скомпилировать с этой ошибкой:

error[E0308]: mismatched types
  --> src/lib.rs:12:15
   |
12 |     x.bar() < y.bar()
   |               ^^^^^^^ expected Foo::A, found Bar::B
   |
   = note: expected associated type `<<T as Bar>::B as Foo>::A`
              found associated type `<T as Bar>::B`

, что, кажется, подразумевает, что вывод типа пытается вызвать B: PartialOrd<B::A> impl вместо B: PartialOrd<B> impl, который также доступен.

Это ошибка или просто (преднамеренное / непреднамеренное) ограничение вывода типа в Rust?

Есть ли способ лучше, чем это:

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