Rust使用移动的值

时间:2016-06-14 15:53:51

标签: rust

使用以下功能时:

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
}

每次使用in时,我都会从while的{​​{1}}行开始逐字地移动值错误。我读过关于借用的内容,我理解得很清楚,但这件事我不明白。 我根本没有“复制”这个价值,所以我没有看到任何地方我可能失去变量的所有权。

2 个答案:

答案 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类型没有实现这个特性。 因此,在每个二进制操作中,您都要移动值。