我正在尝试学习生锈,所以我正在实施一个只评估Collatz猜想的小程序.作为这个的一部分,我有一个函数,我递归调用,我想存储正在评估的当前数字,确定它是奇数还是偶数(或如果它只是一个1终止),执行猜想的那个分支然后用新号码打电话给自己.要做到这一点,我想将一个向量传递给这个函数并将当前数字推送到该向量上,但我很难理解如何传递一个可变向量引用.
这是我的代码:
fn evaluate_conjecture(number_to_be_evaluated: u64, mut intermediate_results: &Vec) -> 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!() }
这是我主要的相关部分
fn main() { let input_number = 42; let mut _intermediate_results: Vec; let number_of_steps = evaluate_conjecture(input_number, &_intermediate_results); }
这是我得到的错误
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 {
| --------- help: consider changing this to be a mutable reference: `&mut std::vec::Vec`
2 | intermediate_results.push(number_to_be_evaluated);
| ^^^^^^^^^^^^^^^^^^^^ `intermediate_results` is a `&` reference, so the data it refers to cannot be borrowed as mutable
我的问题是,如何将此向量传递给函数,以便每次调用函数时都可以对其进行修改
&T
是一个不可变的引用.
&mut T
是一个可变的参考.
改变你的&Vec<u64>
到&mut Vec<u64>
你&_intermediate_results
的&mut _intermediate_results
.
这是一个相当完整的文件; 我建议你阅读文档,如果你没有 - 它解释了很多.