为什么Rust想要一次多次使用变量作为可变变量?

时间:2014-07-07 19:21:37

标签: rust

我试图在Rust中实现动态编程问题以熟悉该语言。像许多动态编程问题一样,它使用memoization来减少运行时间。不幸的是,我的首次通过解决方案会产生错误我已将代码减少到以下内容。警告 - 现在有点荒谬了:

use std::collections::HashMap;

fn repro<'m>(memo: &'m mut HashMap<i32, Vec<i32>>) -> Option<&'m Vec<i32>> {
    {
        let script_a = repro(memo);
        let script_b = repro(memo);
    }

    memo.get(&0)
}

fn main() {}

编译错误是:

error[E0499]: cannot borrow `*memo` as mutable more than once at a time
 --> src/main.rs:6:30
  |
5 |         let script_a = repro(memo);
  |                              ---- first mutable borrow occurs here
6 |         let script_b = repro(memo);
  |                              ^^^^ second mutable borrow occurs here
7 |     }
  |     - first borrow ends here

为什么变量memo多次借用?在我看来,当我计算script_a时,它应该被借用一次,然后借用结束,然后再次借用script_b

2 个答案:

答案 0 :(得分:3)

目前借用它们定义的块的最后一个(#9113如果实施可能会改变它)

问题是script_a(包含对映射的不可变引用)对整个块有效,并且您尝试对同一映射使用可变引用:

let script_a = repro(memo);
let script_b = repro(memo);
// script_a is still alive

答案 1 :(得分:0)

更大的问题是无限循环。无论如何let script_a是对哈希映射内部数据的引用,因此在您调用let script_b = repro(memo);时仍然会借用它。