如何将多个特征组合为 "trait tuple"?
How to combine multiple traits as a "trait tuple"?
我写了一个像这样的库:
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...
请注意,像<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> {...}
谢谢!
您可以创建一个超级特征,将 A
、B
和 C
作为关联类型。
然后为 (A,B,C)
实现该特征,并在需要指定类型时使用它,例如 some_func_that_takes_type_params::<(StructA, StructB, StructC)>()
。
要访问 A
、B
或 C
,请改用关联类型:
trait SuperTrait{
type A: AppleTrait;
type B: BananaTrait;
type C: CarrotTrait;
}
impl<A: AppleTrait, B: BananaTrait, C: CarrotTrait> SuperTrait for (A,B,C)
{
type A = A;
type B = B;
type C = C;
}
struct Foo<D: SuperTrait> (std::marker::PhantomData<D>);
impl<D: SuperTrait> Foo<D> {
/// Example function that returns an A
fn return_a(&self) -> D::A{
todo!()
}
}
也许您可以使用关联类型而不是泛型。例如:
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> {}
定义特征的具体实现时,您可以选择具体类型实现特征请求的关联类型:
impl AbcTrait for Salad {
type Apple = GrannySmith;
type Banana = Cavendish;
type Carrot = LunarWhite;
}
我写了一个像这样的库:
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...
请注意,像<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> {...}
谢谢!
您可以创建一个超级特征,将 A
、B
和 C
作为关联类型。
然后为 (A,B,C)
实现该特征,并在需要指定类型时使用它,例如 some_func_that_takes_type_params::<(StructA, StructB, StructC)>()
。
要访问 A
、B
或 C
,请改用关联类型:
trait SuperTrait{
type A: AppleTrait;
type B: BananaTrait;
type C: CarrotTrait;
}
impl<A: AppleTrait, B: BananaTrait, C: CarrotTrait> SuperTrait for (A,B,C)
{
type A = A;
type B = B;
type C = C;
}
struct Foo<D: SuperTrait> (std::marker::PhantomData<D>);
impl<D: SuperTrait> Foo<D> {
/// Example function that returns an A
fn return_a(&self) -> D::A{
todo!()
}
}
也许您可以使用关联类型而不是泛型。例如:
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> {}
定义特征的具体实现时,您可以选择具体类型实现特征请求的关联类型:
impl AbcTrait for Salad {
type Apple = GrannySmith;
type Banana = Cavendish;
type Carrot = LunarWhite;
}