【问题标题】:Rust use of moved valueRust 使用移动值
【发布时间】:2016-06-14 15:53:50
【问题描述】:

使用以下功能时:

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 的行开始,也在if 中。我读过关于借贷的书,我理解得体,但这件事我不明白。 我根本没有“复制”这个值,所以我看不到任何地方我可能会失去对变量的所有权。

【问题讨论】:

  • BigInt 是什么类型?它来自哪个板条箱?
  • 哦,对不起,来自num。它是一个很大的 int,它没有实现 Copy 特征,因为这将非常、非常、非常占用 CPU 时间。 (我知道我也在这里复制它,我无法为我的生活找到更好的解决方案)
  • 啊,不用道歉,只是想知道他们是哪种类型。

标签: rust


【解决方案1】:

Mul(和其他算术运算符)按值获取参数,因此 i * i 移动值 i(这对于原始数字来说不是问题,因为它们实现了 Copy - BigInt 没有)。

由于Mul 是为(两个)&amp;BigInt 实现的,您可以使用&amp; 进行乘法(和其他算术运算):

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 上的类型并使用 BigInt::from(不能失败)。

【讨论】:

  • 这是有道理的。 BigInt::one() 包含在什么中,因为由于某种原因 Rust 找不到它... 编辑:找到它,它用大写字母拼写以包含它,无论出于何种原因
  • 你必须导入num::One
  • @Epse num::One 是一个特征,所以大写。 trait 包含一个函数 One::one,只有在 trait 也是可见的情况下才能被 trait 实现者访问。
【解决方案2】:

请记住,Rust 中的运算符只是函数调用的语法糖。

a + b 转换为 a.add(b)

诸如i32 之类的原始类型实现了特征Copy。因此,它们可以被复制到这样的添加函数中,并且不需要移动。

我假设您正在使用的 BigInt 类型没有实现此特征。 因此,在每个二元运算中,您都在移动值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-27
    • 2021-11-09
    • 1970-01-01
    • 2021-06-01
    • 2020-06-21
    • 1970-01-01
    • 2016-07-11
    • 2022-12-19
    相关资源
    最近更新 更多