如何将多个特征组合为“特征元组”?

fzy*_*cjy 3 traits rust

我写了一个像这样的库:

struct Foo<A: AppleTrait, B: BananaTrait, C: CarrotTrait> {...}

impl<A: AppleTrait, B: BananaTrait, C: CarrotTrait> Foo<A,B,C> {...}

struct Bar<A: AppleTrait, B: BananaTrait, C: CarrotTrait> {...}

impl<A: AppleTrait, B: BananaTrait, C: CarrotTrait> Bar<A,B,C> {...}

... and many more...
Run Code Online (Sandbox Code Playgroud)

请注意,像这样的东西<A: AppleTrait, B: BananaTrait, C: CarrotTrait>总是聚在一起,并且出现了很多次。所以我想消除这样的负担。

因此,我希望我可以做这样的事情:

define_the_trait_alias ABCTrait = (A: AppleTrait, B: BananaTrait, C: CarrotTrait); // How to do this?

struct Foo<ABC: ABCTrait> {...}

impl<ABC: ABCTrait> Foo<ABC> {...}
Run Code Online (Sandbox Code Playgroud)

谢谢!

use*_*342 5

也许您可以使用关联类型而不是泛型。例如:

trait AbcTrait {
    type Apple: AppleTrait;
    type Banana: BananaTrait;
    type Carrot: CarrotTrait;
}

struct Foo<Abc: AbcTrait> {
    abc: Abc,
}
impl<Abc: AbcTrait> Foo<Abc> {}

struct Bar<Abc: AbcTrait> {
    abc: Abc,
}
impl<Abc: AbcTrait> Bar<Abc> {}
Run Code Online (Sandbox Code Playgroud)

在定义 trait 的具体实现时,你可以选择哪个具体类型实现了 trait 请求的关联类型:

impl AbcTrait for Salad {
    type Apple = GrannySmith;
    type Banana = Cavendish;
    type Carrot = LunarWhite;
}
Run Code Online (Sandbox Code Playgroud)