我试图在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
。
答案 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);
时仍然会借用它。