Я работаю с несколькими чертами, которые имеют связанные типы:
trait Foo {
type FooType;
}
trait Bar {
type BarType;
}
trait Baz {
type BazType;
}
У меня есть функция, в которой мне нужно связать эти связанные типы.Я могу сделать это так ( Детская площадка ):
fn do_the_thing<T>(_: T)
where
T: Foo,
T::FooType: Bar,
<T::FooType as Bar>::BarType: Baz,
<<T::FooType as Bar>::BarType as Baz>::BazType: Clone,
{}
Это работает, но очень многословно.Одна проблема заключается в том, что мне нужно использовать синтаксис <Type as Trait>
для устранения неоднозначности нескольких путей, хотя в этом нет необходимости.Об этой проблеме уже сообщалось здесь .
Интересно, возможно ли сократить определение вышеупомянутой функции.Я подумал, может быть, возможно объединить все границы в одну:
fn do_the_thing<T>(_: T)
where
T: Foo<FooType: Bar<BarType: Baz<BazType: Clone>>>,
{}
Но это приводит к синтаксической ошибке:
error: expected one of `!`, `(`, `+`, `,`, `::`, `<`, or `>`, found `:`
--> src/main.rs:16:19
|
16 | T: Foo<FooType: Bar<BarType: Baz<BazType: Clone>>>,
| ^ expected one of 7 possible tokens here
Есть ли способ сжатия границкак-то?