如何在Rust中将可变向量作为函数参数传递

mer*_*219 9 mutable rust

我正在尝试学习生锈,所以我正在实施一个只评估Collat​​z猜想的小程序.作为这个的一部分,我有一个函数,我递归调用,我想存储正在评估的当前数字,确定它是奇数还是偶数(或如果它只是一个1终止),执行猜想的那个分支然后用新号码打电话给自己.要做到这一点,我想将一个向量传递给这个函数并将当前数字推送到该向量上,但我很难理解如何传递一个可变向量引用.

这是我的代码:

fn evaluate_conjecture(number_to_be_evaluated: u64, mut intermediate_results: &Vec<u64>) -> u64 {
    intermediate_results.push(number_to_be_evaluated);

    if number_to_be_evaluated == 1 {
        0
    } else if number_to_be_evaluated % 2 == 1 {
        let odd_step_result = perform_odd_conjecture_step(number_to_be_evaluated);
        evaluate_conjecture(odd_step_result, intermediate_results) + 1
    } else {
        let even_step_result = perform_even_conjecture_step(number_to_be_evaluated);
        evaluate_conjecture(even_step_result, intermediate_results) + 1
    }
}

fn perform_odd_conjecture_step(_: u64) -> u64 {
    unimplemented!()
}

fn perform_even_conjecture_step(_: u64) -> u64 {
    unimplemented!()
}
Run Code Online (Sandbox Code Playgroud)

这是我主要的相关部分

fn main() {
    let input_number = 42;
    let mut _intermediate_results: Vec<u64>;
    let number_of_steps = evaluate_conjecture(input_number, &_intermediate_results);
}
Run Code Online (Sandbox Code Playgroud)

这是我得到的错误

error[E0596]: cannot borrow `*intermediate_results` as mutable, as it is behind a `&` reference
 --> src/main.rs:2:5
  |
1 | fn evaluate_conjecture(number_to_be_evaluated: u64, mut intermediate_results: &Vec<u64>) -> u64 {
  |                                                                               --------- help: consider changing this to be a mutable reference: `&mut std::vec::Vec<u64>`
2 |     intermediate_results.push(number_to_be_evaluated);
  |     ^^^^^^^^^^^^^^^^^^^^ `intermediate_results` is a `&` reference, so the data it refers to cannot be borrowed as mutable
Run Code Online (Sandbox Code Playgroud)

我的问题是,如何将此向量传递给函数,以便每次调用函数时都可以对其进行修改

Chr*_*gan 12

&T 是一个不可变的引用.

&mut T 是一个可变的参考.

改变你的&Vec<u64>&mut Vec<u64>&_intermediate_results&mut _intermediate_results.

这是一个相当完整的文件; 我建议你阅读文档,如果你没有 - 它解释了很多.

  • 对不起,我在http://doc.rust-lang.org/tutorial.html上阅读了参考指南和教程.这些引用中唯一具有函数参数的mut关键字的示例代码将mut关键字放在变量名而不是类型上.并且,为了将可变变量作为函数参数传递(在原型中也标记为mut),您也必须在调用函数时将mut关键字放在参数前面.还有其他一些我应该阅读的文件吗? (13认同)
  • 2019 更新:参见 https://doc.rust-lang.org/stable/book/ch04-02-references-and-borrowing.html#mutable-references (2认同)