rust - 预期引用,找到结构

标签 rust

我正在尝试通过翻译 Stepanov 和 McJones 所著的“编程基础”一书中的 C++ 代码来学习 Rust。这是一个简单的代码片段:

extern crate num_bigint;

use num_bigint::BigInt;

pub fn fibonacci_matrix_multiply(x: (&BigInt, &BigInt), y: (&BigInt, &BigInt)) -> (BigInt, BigInt) {
    (x.0 * (y.1 + y.0) + x.1 * y.0, x.0 * y.0 + x.1 * y.1)
}

pub fn power_accumulate_positive(
    mut r: (&BigInt, &BigInt),
    mut a: (&BigInt, &BigInt),
    mut n: i32,
) -> (BigInt, BigInt) {
    loop {
        if n & 1 == 1 {
            r = fibonacci_matrix_multiply(r, a);
            if n == 1 {
                return r;
            }
        }
        a = fibonacci_matrix_multiply(a, a);
        n = n / 2;
    }
}

fn main() {}

错误信息如下:

error[E0308]: mismatched types
  --> src/main.rs:16:17
   |
16 |             r = fibonacci_matrix_multiply(r, a);
   |                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected reference, found struct `num_bigint::BigInt`
   |
   = note: expected type `(&num_bigint::BigInt, &num_bigint::BigInt)`
              found type `(num_bigint::BigInt, num_bigint::BigInt)`

error[E0308]: mismatched types
  --> src/main.rs:18:24
   |
18 |                 return r;
   |                        ^ expected struct `num_bigint::BigInt`, found reference
   |
   = note: expected type `(num_bigint::BigInt, num_bigint::BigInt)`
              found type `(&num_bigint::BigInt, &num_bigint::BigInt)`

error[E0308]: mismatched types
  --> src/main.rs:21:13
   |
21 |         a = fibonacci_matrix_multiply(a, a);
   |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected reference, found struct `num_bigint::BigInt`
   |
   = note: expected type `(&num_bigint::BigInt, &num_bigint::BigInt)`
              found type `(num_bigint::BigInt, num_bigint::BigInt)`

我知道我正在返回一个结构元组并试图将它分配给一个引用元组,但我不知道如何解决这个问题。

最佳答案

您不能按值而不是按引用获取 BigInt 有什么原因吗?这将消除所有借用检查器错误。除非克隆 BigInt 是一个明确且已衡量的瓶颈,否则通过引用传递不会更快并且更不符合人体工程学。

这是一个不使用引用(而是克隆值)的工作解决方案

extern crate num_bigint;

use num_bigint::BigInt;

pub fn fibonacci_matrix_multiply(x: (BigInt, BigInt), y: (BigInt, BigInt)) -> (BigInt, BigInt) {
    (&x.0 * (&y.1 + &y.0) + &x.1 * &y.0, x.0 * y.0 + x.1 * y.1)
}

pub fn power_accumulate_positive(
    mut r: (BigInt, BigInt),
    mut a: (BigInt, BigInt),
    mut n: i32,
) -> (BigInt, BigInt) {
    loop {
        if n & 1 == 1 {
            r = fibonacci_matrix_multiply(r, a.clone());
            if n == 1 {
                return r;
            }
        }
        a = fibonacci_matrix_multiply(a.clone(), a);
        n = n / 2;
    }
}

关于rust - 预期引用,找到结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45944145/

相关文章:

rust - 使用人造丝并行迭代器时的同步和发送特征

functional-programming - 如何在 Rust 中组合函数?

multithreading - 有没有办法在 Rust 中生成具有指定生命周期的线程?

rust - "the method cannot be invoked on a trait object"在单独的特征实现上

types - 为什么 Rust 中没有任意大小的二进制整数类型?

rust - 从 for 循环内部返回导致类型不匹配

generics - E0119 通用特征实现错误

rust - 派生特征会导致意外的编译器错误,但手动实现有效

rust - 如何向/从 NonNull<Opaque> 添加/减去偏移量?

rust - Serde Deserializer,如何在直接解码 `u8`和在 `u8`中解码 `Vec<u8>`时具有独特的行为