是否可以组合嵌套关联类型的边界?

时间:2018-06-10 10:21:37

标签: rust associated-types

我使用了几个具有关联类型的特征:

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

有没有办法以某种方式压缩边界?

1 个答案:

答案 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>>>,
{}

Playground