rust HashMap entry()方法保持借位的时间比预期的要长

bttbmeg0  于 2022-12-23  发布在  其他
关注(0)|答案(1)|浏览(242)

我刚开始学习Rust,就遇到了HashMap的entry()方法的一个看似奇怪的行为。在下面的例子中,该方法接受一个可变引用并返回Entry enum。我甚至没有捕获和持久化返回值。但借用检查器似乎认为在下一次迭代开始时,对“s”的可变引用仍然在作用域中。

let mut window: HashMap<&String, i32> = HashMap::new();
let mut s = "help_me".to_string();
loop {
    let p = &mut s;        // ERROR
    window.entry(p);
}

这将显示代码段死机,并显示错误:

Line 27, Char 26: cannot borrow `s` as mutable more than once at a time (solution.rs)
   |
27 |             window.entry(&mut s);
   |                          ^^^^^^ `s` was mutably borrowed here in the previous iteration of the loop

有人能给我解释一下这种行为吗?

flvtvl50

flvtvl501#

Map的键类型是&String,我们称其为生存期&'a String
entry()方法可能需要将键插入到Map中(这是入口API的全部思想),因此,它采用与键相同的类型,即&'a String
当你借用s时,你需要借用持续'a,这样你就可以从它那里得到&'a String,所以你可以可变地借用'a
但是下一次循环执行时,'a仍然是活动的(因为Map仍然是活的),你再次借用s,再次为'a借用,而它已经为'a可变地借用了,所以你不能在这段时间借用它,这就是错误。
您可能需要String(而不是&String)的Map,或者,即使您确实需要引用,您也可以使用window.entry(&s);来代替window.entry(&mut s);,然后它将工作,因为您可以多次借用共享引用的值。

相关问题