Этот код:
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)