实现通用数字功能

Implementing generic digits function

我想实现 digits 函数,该函数 return 是给定数字的单个数字向量。例如,digits(12345) 应该 return Vec[1, 2, 3, 4, 5].

在解决了一些小问题之后,我得到了以下代码:

fn digits<T, R>(mut n: T) -> Vec<R> where 
    T: Num + Rem + DivAssign + FromPrimitive + Copy,
    R: Num + TryFrom<T>
{
    let zero = T::zero();
    let ten: T = T::from_i8(10).unwrap();
    let mut acc: Vec<R> = Vec::new();

    while n != zero {
        let d: R = R::try_from(n % ten).ok().unwrap();
        acc.push(d);
        n /= ten;
    }
    acc.reverse();
    acc
}

这似乎适用于大多数原始整数类型。问题是输入类型 T 应该实现 Copy,我不能将此函数用于 BigIntBigUint,因为 Copy 没有为它们实现.

如果我从 T 中删除 Copy 特征,编译将因各种错误而失败,并出现 bowwor of moved value: nuse of moved value: ten.

等消息

如何解决这个问题,使其可以处理原始整数以及 BigIntBigUint

任何实现 Copy 的东西也会实现 CloneBigIntBigUint 也实现 Clone。因此,您可以改为将约束更改为 Clone,并显式添加您可能需要的任何克隆。

fn digits<T, R>(mut n: T) -> Vec<R> where 
    T: Num + Rem + DivAssign + FromPrimitive + Clone,
    R: Num + TryFrom<T>
{
...
}

Playground