使用以下功能时:
fn factors(number: &BigInt) -> Vec<BigInt> {
let mut n = number.clone();
let mut i: BigInt = ToBigInt::to_bigint(&2).unwrap();
let mut factors = Vec::<BigInt>::new();
while i * i <= n {
if (n % i) == ToBigInt::to_bigint(&1).unwrap() {
i = i + ToBigInt::to_bigint(&1).unwrap();
}
else {
n = n/i as BigInt;
factors.push(i);
}
i = i + ToBigInt::to_bigint(&1).unwrap();
}
if n > i {
factors.push(n);
}
factors
}
每次使用i
或n
时,我都会从while
的{{1}}行开始逐字地移动值错误。我读过关于借用的内容,我理解得很清楚,但这件事我不明白。
我根本没有“复制”这个价值,所以我没有看到任何地方我可能失去变量的所有权。
答案 0 :(得分:6)
Mul
(和其他算术运算符)按值获取参数,因此i * i
移动值i
(这对于原始数字不是问题,因为它们实现{{1 } - Copy
没有。)
当BigInt
为(两个)Mul
实现时,您可以使用&BigInt
进行乘法(以及其他算术运算):
&
请注意,我也进行了一些简化,例如省略use num::*;
fn factors(number: &BigInt) -> Vec<BigInt> {
let mut n = number.clone();
let mut i = BigInt::from(2);
let mut factors = Vec::new();
while &i * &i <= n {
if (&n % &i) == BigInt::one() {
i = i + BigInt::one();
} else {
n = n / &i;
factors.push(i.clone());
}
i = i + BigInt::one();
}
if n > i {
factors.push(n);
}
factors
}
上的类型并使用Vec::new
(不能失败)。
答案 1 :(得分:3)
请记住,Rust中的运算符只是函数调用的语法糖。
a + b
转换为a.add(b)
。
i32
等原始类型实现了特征Copy
。因此,它们可以被复制到这样的添加功能中而不需要移动。
我认为你正在使用的BigInt
类型没有实现这个特性。
因此,在每个二进制操作中,您都要移动值。