#tuple #traits #building #head #couple #tricks #inductively

tuple_tricks

在元组上的一些特质,允许递归地构建新的特质

3个不稳定版本

0.2.1 2021年12月22日
0.2.0 2021年12月22日
0.1.0 2021年12月18日

Rust模式中排名第2285

MIT许可证

6KB
88

构建所有元组的递归特质(长度最多为32)。

首先,你需要为所有元组提供一个标记。这是通过

mark_tuples!(MyMarker)

然后定义一个你想要应用于长度最多为32的元组的特质

trait MyInductiveTrait {
    type AccumulatedTupleType;
    fn fn_to_build_accumulated_type_from_self(self) -> Self::AccumulatedTupleType;
}

然后定义一个一元组的特质(即归纳的起点)

impl<A> MyInductiveTrait for (A,) {
    type AccumulatedTupleType = (MyStruct<A>,);

    fn fn_to_build_accumulated_type_from_self(self) -> Self::AccumulatedTupleType {
        let (a,) = self;
        (MyStruct::new(a),)
    }
}

最难的是归纳步骤,你可能需要很多特质界限

impl<TupleType, Head, PrevTupleType, PrevAccumulatedTuple> MyInductiveTrait for TupleType
where
    TupleType: PreviousTuple<Head = Head, TailTuple = PrevTuple> + MyMarker,
    // You need the `MyMarker` trait because otherwise the compiler complains about potential
    // changes to the PreviousTuple implementation.
    PrevTuple: MyInductiveTrait<AccumulatedTupleType = PrevAccumulatedTuple>,
    PrevAccumulatedTuple: NestTuple,
    (PrevAccumulatedTuple::Nested, MyStruct<Head>): UnnestTuple
{
    ...
}

依赖关系