Pointers 如何递归传递可变引用?

Pointers 如何递归传递可变引用?,pointers,rust,Pointers,Rust,我正试图解决生锈的问题 以下是我的非编译防锈代码: use std::collections::HashMap; fn main() { // initialize HashMap let mut fibs: HashMap<u32, u32> = HashMap::new(); fibs.insert(0, 1); fibs.insert(1, 1); let mut n = 1; let mut sum = 0; whil

我正试图解决生锈的问题

以下是我的非编译防锈代码:

use std::collections::HashMap;

fn main() {
    // initialize HashMap
    let mut fibs: HashMap<u32, u32> = HashMap::new();
    fibs.insert(0, 1);
    fibs.insert(1, 1);
    let mut n = 1;
    let mut sum = 0;
    while fib(n, &mut fibs) < 4000000 {
        sum += if fib(n, &mut fibs) % 2 == 0 {
            fib(n, &mut fibs)
        } else {
            0
        };
        n += 1;
    }
    println!("{}", sum);
}

fn fib(n: u32, fibs: &mut HashMap<u32, u32>) -> u32 {
    if !fibs.contains_key(&n) {
        fibs.insert(n, fib(n - 1, &mut fibs) + fib(n - 2, &mut fibs));
    }
    *fibs.get(&n).unwrap()
}
使用std::collections::HashMap;
fn main(){
//初始化哈希映射
让mut fibs:HashMap=HashMap::new();
fibs.插入(0,1);
fibs.插入(1,1);
设mutn=1;
设mut和=0;
而fib(n,&mut-fibs)<4000000{
总和+=如果fib(n,&mut fibs)%2==0{
fib(n和多个fib)
}否则{
0
};
n+=1;
}
println!(“{}”,总和);
}
fn fib(n:u32,fibs:&mut HashMap)->u32{
如果!fibs.包含\u键(&n){
fibs.插入(n,fib(n-1,&mut-fibs)+fib(n-2,&mut-fibs));
}
*fibs.get(&n).unwrap()
}
error[E0596]:不能将'fibs'借用为可变的,因为它未声明为可变的
-->src/main.rs:22:35
|
20 | fn fib(n:u32,fibs:&mut HashMap)->u32{
帮助:考虑改变这个是可变的:“哑巴”
21 |如果!fibs.包含_键(&n){
22 | fibs.插入(n,fib(n-1和多个fibs)+fib(n-2和多个fibs));
|^^^^^^^^^^^^^^不能以可变形式借用
错误[E0499]:不能一次多次借用'fibs'作为可变项
-->src/main.rs:22:35
|
22 | fibs.插入(n,fib(n-1和多个fibs)+fib(n-2和多个fibs));
|------^^^^^^^^第二个可变借用发生在此处
|         |    |
||先借后用
|第一个可变借用发生在这里
错误[E0596]:无法将'fibs'借用为可变的,因为它未声明为可变的
-->src/main.rs:22:59
|
20 | fn fib(n:u32,fibs:&mut HashMap)->u32{
帮助:考虑改变这个是可变的:“哑巴”
21 |如果!fibs.包含_键(&n){
22 | fibs.插入(n,fib(n-1和多个fibs)+fib(n-2和多个fibs));
|^^^^^^^^^^^^^^不能以可变形式借用
错误[E0499]:不能一次多次借用'fibs'作为可变项
-->src/main.rs:22:59
|
22 | fibs.插入(n,fib(n-1和多个fibs)+fib(n-2和多个fibs));
|---------调用使用的第一次借用^^^^^^^^^第二次可变借用发生在此处
|         |
|第一个可变借用发生在这里
铁锈到Python3的翻译如下所示:

def main():
fibs={}
fibs[0]=1
fibs[1]=1
n=1
总和=0
当fib(n,fibs)<4000000时:
summ+=fib(n,fibs)如果fib(n,fibs)%2==0其他0
n+=1
打印(汇总)
打印(小谎)
def fib(n,fibs):
如果n不在fibs中:
fibs[n]=fib(n-1,fibs)+fib(n-2,fibs)
返回fibs[n]
main()
我知道这个特定的实现并不理想,但我只是想学习语言。我只是想把hashmap的引用传递给函数。如果可能的话,在不改变解决这个问题的方法的情况下,我如何使用可变的
hashmap
引用

最后一位是借用检查器的一个限制-使用
&mut
接收器的嵌套方法调用会导致借用错误,但将它们分离为单独的语句可以解决此问题


作为:


虽然将可变引用转换为可变引用并不有用,并且会出现一些混乱,但这通常不是类型错误,因为deref强制可以将
&mut&mut T T
转换为
&mut T
,至少在编译器知道需要
&mut
时是这样

这反映在编译器错误消息中:

error[E0596]:不能将'fibs'借用为可变的,因为它未声明为可变的
-->src/main.rs:22:35
|
20 | fn fib(n:u32,fibs:&mut HashMap)->u32{
帮助:考虑改变这个是可变的:“哑巴”
21 |如果!fibs.包含_键(&n){
22 | fibs.插入(n,fib(n-1和多个fibs)+fib(n-2和多个fibs));
|^^^^^^^^^^^^^^不能以可变形式借用

实际上,进行建议的更改允许代码继续执行下一个错误。但是,像这样的嵌套引用会使事情过于复杂,因此最好保持适当数量的引用。

虽然将可变引用转换为可变引用是没有用的,并且会显示出一些混乱,但它通常不是一个典型的错误e错误,因为deref强制可以将
&mut&mut T T
转换为
&mut T T
,至少当编译器知道需要
&mut T T
时是这样。@ljeabmreosn是的,昨晚键入时很困。现在修复,并用delnan的注释更新。
fn fib(n: u32, fibs: &mut HashMap<u32, u32>) -> u32 {
fn fib(n: u32, fibs: &mut HashMap<u32, u32>) -> u32 {
    if !fibs.contains_key(&n) {
        let a = fib(n - 1, fibs);
        let b = fib(n - 2, fibs);
        fibs.insert(n, a + b);
    }
    *fibs.get(&n).unwrap()
}