我正在尝试自己实现大整数(仅用于教育)。实现是通用的数据类型:
struct LongNum<T>
where T: Integer + MulAssign + CheckedMul + CheckedAdd + Copy + From<u8>
{
values: Vec<T>,
powers: Vec<u8>,
radix: u8,
}
问题是我需要在所有 impl 中为 T 重复这个冗长的约束。太麻烦了。
我可以结合这些约束来创建自己的特征,如下所示:
trait LongNumValue: Integer + MulAssign + CheckedMul + CheckedAdd + Copy + From<u8> {}
struct LongNum<T: LongNumValue>
{
values: Vec<T>,
powers: Vec<u8>,
radix: u8,
}
但在这种情况下,我必须将此 LongNumValue 特征的实现添加到可在 LongNum 中使用的所有类型:
impl LongNumValue for u8 {}
impl LongNumValue for u16 {}
impl LongNumValue for u32 {}
...
这意味着如果我不向这个 impl 列表添加某种类型,我的箱子的用户将无法将这种类型用于 LongNum,即使这种类型通过了所有约束。
有没有什么方法可以避免编写冗长的重复性约束而不给用户增加不必要的限制?
最佳答案
您可以添加一揽子实现:
impl<T> LongNumValue for T
where
T: Integer + MulAssign + CheckedMul + CheckedAdd + Copy + From<u8> {}
关于generics - 如何避免 Rust 中重复的长通用约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55568655/