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

Posted

技术标签:

【中文标题】如何避免 Rust 中重复的长泛型约束【英文标题】:How to avoid repetitive long generic constraints in Rust 【发布时间】:2019-04-08 07:56:37 【问题描述】:

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

struct LongNum<T>
where T: Integer + MulAssign + CheckedMul + CheckedAdd + Copy + From<u8>

    values: Vec<T>,
    powers: Vec<u8>,
    radix: u8,

问题是我需要在所有 impls 中对 T 重复这个详细的约束。太麻烦了。

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

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

struct LongNum<T: LongNumValue>

    values: Vec<T>,
    powers: Vec<u8>,
    radix: u8,

但在这种情况下,我必须将这个 LongNumValue trait 的 impls 添加到可以在 LongNum 中使用的所有类型:

impl LongNumValue for u8 
impl LongNumValue for u16 
impl LongNumValue for u32 
...

这意味着如果我不向这个 impl 列表中添加某种类型,我的 crate 的用户将无法将这种类型用于 LongNum,即使这种类型通过了所有约束。

有什么方法可以避免编写冗长的重复性约束而不给用户增加不必要的限制?

【问题讨论】:

你的意思是类似的? ***.com/questions/55553281/… 【参考方案1】:

您可以添加一个一揽子实现

impl<T> LongNumValue for T 
where
    T: Integer + MulAssign + CheckedMul + CheckedAdd + Copy + From<u8> 

【讨论】:

以上是关于如何避免 Rust 中重复的长泛型约束的主要内容,如果未能解决你的问题,请参考以下文章

如何使用泛型避免类型安全警告[重复]

generics - 如何在Rust中添加一个泛型类型实现另一泛型类型的约束?

无法用类型约束重载泛型方法[重复]

Rust编程语言入门之泛型Trait生命周期

多类型参数约束的C#泛型语法[重复]

使用带有约束的泛型时无法隐式转换类型[重复]