为什么 Rust 想要一次多次借用一个可变变量?

She*_*ter 5 rust

我正在尝试在 Rust 中实现一个动态编程问题以熟悉该语言。像许多动态规划问题一样,这使用记忆化来减少运行时间。不幸的是,我的第一遍解决方案会产生错误。我已将代码缩减为以下内容。警告 - 现在有点荒谬:

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() {}
Run Code Online (Sandbox Code Playgroud)

编译错误是:

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() {}
Run Code Online (Sandbox Code Playgroud)

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

Arj*_*jan 4

目前最后借用的是它们定义的块(#9113如果实现的话可能会改变这一点)

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

let script_a = repro(memo);
let script_b = repro(memo);
// script_a is still alive
Run Code Online (Sandbox Code Playgroud)