繁体   English   中英

"为实现另一个特征的所有具体类型一般地实现一个特征"

[英]Generically implementing a trait for all concrete types implementing another trait

我对 rust 很陌生,所以这可能是一个愚蠢的问题,答案很明显,但我还不知道答案。 我刚刚读过这本书,然后决定实现一些我熟悉的算法,以感受一下这门语言。 然而,这让我走上了一条黑暗的道路,进入了一个比我计划的语言更深入的副项目......

无论如何,我现在正在使用一些代码来以类型安全的方式处理某些算法中的索引和偏移量。 我有不同数组和字符串的索引,并希望防止将一个数组中的索引用于另一个数组和类似的东西。 因此,我为不同类型的索引、具有不同域的索引以及它们之间的偏移量定义了新类型。 我不允许域之间的比较,我可以减去索引以获得偏移量,我可以添加和减去索引和偏移量以及类似的东西。 此外,我可以定义哪些类型的对象索引可以下标,因此字符串的索引只能索引字符串,而不是后缀数组,其中需要另一种类型。

这主要是有效的。 我有一堆宏来定义允许执行的对象。 例如,有了这个

def_offset!(Offset);
def_idx!(
    Idx
    with offset Offset
    with sub [
        Vec<T>[Idx] => T,
        [T][Idx] => T
    ]
);

看看操场上的例子,不可能做你想做的事。 这种类型的 impl 不能工作:

impl<X, RHS> std::ops::Add<RHS> for X
where
    X: MyAdd<RHS>,
{
    type Output = X::Res;
    fn add(self, rhs: RHS) -> Self::Output {
        self.my_add(rhs)
    }
}

我又打了一点,我想我可能有一个解决办法。 由于我无法为一般类型实现特征,而只能在我自己的 crate 中实现类型,这就是我必须做的。 我不想这样做,因为我想使用这些类型来定义不同的运算符,但我认为会有办法解决这个问题。

这是我现在所拥有的。 我定义了一个类型来包含有关我将持有的包装对象的信息。 然后我将包装对象,并使用这种类型的实例作为标签,为我的包装器提供不同的底层类型,并以此方式定义运算符。

// Any of the wrapped types should have this.
pub trait TypeInfo: Copy {
    type WrappedType: Copy + num::PrimInt;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM