我正在try 自己实现大整数(只是为了教育).根据数据类型,实现是通用的:

struct LongNum<T>
where T: Integer + MulAssign + CheckedMul + CheckedAdd + Copy + From<u8>
{
    values: Vec<T>,
    powers: Vec<u8>,
    radix: u8,
}

问题是我需要在所有impl中对T重复这个冗长的约束.太麻烦了.

结合这些约束条件,我可以创造自己的trait ,比如:

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

struct LongNum<T: LongNumValue>
{
    values: Vec<T>,
    powers: Vec<u8>,
    radix: u8,
}

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

impl LongNumValue for u8 {}
impl LongNumValue for u16 {}
impl LongNumValue for u32 {}
...

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

有没有什么方法可以避免编写长时间重复的costraints,而不给用户增加不必要的限制?

推荐答案

您可以添加blanket implementation:

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

Rust相关问答推荐

有没有方法处理rust中嵌套的ok_or()?

捕获Rust因C++异常而产生panic

为什么我们不能通过指针算法将Rust原始指针指向任意地址?'

Tauri tauri—apps/plugin—store + zustand

为什么我需要在这个代码示例中使用&

为什么实例方法可以像Rust中的静态方法一样被调用?

默认特征实现中的生命周期问题

在Rust中是否可以使用Rc自动化约束传播

铁 rust ,我的模块介绍突然遇到了一个问题

为什么 `Deref` 没有在 `Cell` 上实现?

通过异常从同步代码中产生yield 是如何工作的?

为什么我需要 to_string 函数的参考?

如何将带有嵌套borrow /NLL 的 Rust 代码提取到函数中

在 Rust 中,为什么 10 个字符的字符串的 size_of_val() 返回 24 个字节?

如何为整数切片定义一个带有额外函数的特性别名?

Rust中如何实现一个与Sized相反的负特性(Unsized)

Rust 打包在 .deb 中

push 方法是否取得所有权?

Rust 异步和 AsRef 未被发送

如何在不设置精度的情况下打印浮点数时保持尾随零?