实现通用数字功能
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
,我不能将此函数用于 BigInt
或 BigUint
,因为 Copy
没有为它们实现.
如果我从 T
中删除 Copy
特征,编译将因各种错误而失败,并出现 bowwor of moved value: n
或 use of moved value: ten
.
等消息
如何解决这个问题,使其可以处理原始整数以及 BigInt
和 BigUint
?
任何实现 Copy
的东西也会实现 Clone
,BigInt
和 BigUint
也实现 Clone
。因此,您可以改为将约束更改为 Clone
,并显式添加您可能需要的任何克隆。
fn digits<T, R>(mut n: T) -> Vec<R> where
T: Num + Rem + DivAssign + FromPrimitive + Clone,
R: Num + TryFrom<T>
{
...
}
我想实现 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
,我不能将此函数用于 BigInt
或 BigUint
,因为 Copy
没有为它们实现.
如果我从 T
中删除 Copy
特征,编译将因各种错误而失败,并出现 bowwor of moved value: n
或 use of moved value: ten
.
如何解决这个问题,使其可以处理原始整数以及 BigInt
和 BigUint
?
任何实现 Copy
的东西也会实现 Clone
,BigInt
和 BigUint
也实现 Clone
。因此,您可以改为将约束更改为 Clone
,并显式添加您可能需要的任何克隆。
fn digits<T, R>(mut n: T) -> Vec<R> where
T: Num + Rem + DivAssign + FromPrimitive + Clone,
R: Num + TryFrom<T>
{
...
}