我使用了几个具有关联类型的特征:
trait Foo {
type FooType;
}
trait Bar {
type BarType;
}
trait Baz {
type BazType;
}
我有一个函数,我需要绑定那些相关的类型。我可以这样做(Playground):
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>
语法消除一些路径的歧义,尽管这不是必需的。此问题已报告here。
我想知道是否可以缩短上述功能的定义。我想,也许可以将所有边界合并为一个:
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
有没有办法以某种方式压缩边界?
答案 0 :(得分:1)
现在可以通过不稳定功能associated_type_bounds
(tracking issue)来实现。
#![feature(associated_type_bounds)]
fn do_the_thing<T>(_: T)
where
T: Foo<FooType: Bar<BarType: Baz<BazType: Clone>>>,
{}