簡體   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