如何避免在Rust中出现重复的长泛型约束

Mic*_*yin 12 generics constraints traits rust

我正在尝试自己实现大整数(仅用于教育)。该实现按数据类型通用:

struct LongNum<T>
where T: Integer + MulAssign + CheckedMul + CheckedAdd + Copy + From<u8>
{
    values: Vec<T>,
    powers: Vec<u8>,
    radix: u8,
}
Run Code Online (Sandbox Code Playgroud)

问题在于,我需要在所有impls中对T重复此冗长的约束。太麻烦了

我可以结合这些约束来做出自己的特征,如下所示:

trait LongNumValue: Integer + MulAssign + CheckedMul + CheckedAdd + Copy + From<u8> {}

struct LongNum<T: LongNumValue>
{
    values: Vec<T>,
    powers: Vec<u8>,
    radix: u8,
}
Run Code Online (Sandbox Code Playgroud)

但是在这种情况下,我必须为此LongNumValue特性添加impls到可以在LongNum中使用的所有类型:

impl LongNumValue for u8 {}
impl LongNumValue for u16 {}
impl LongNumValue for u32 {}
...
Run Code Online (Sandbox Code Playgroud)

这意味着,如果我不向此impls列表中添加某种类型,则即使该类型传递了所有约束,我的板条箱用户也将无法将其用于LongNum。

有什么方法可以避免编写长时间的重复成本损失,而又不会给用户增加不必要的限制?

sta*_*lue 19

您可以添加一个整体实现

impl<T> LongNumValue for T 
where
    T: Integer + MulAssign + CheckedMul + CheckedAdd + Copy + From<u8> {}
Run Code Online (Sandbox Code Playgroud)