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



我刚刚开始学习Rust,并且遇到了HashMap的entry()方法的一个看似奇怪的行为。在下面的示例中,该方法接受一个可变引用并返回Entry枚举。我甚至没有捕获和保存返回值。但是借用检查器似乎认为对" "的可变引用在下一次迭代开始时仍然在作用域中。

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
谁能给我解释一下这种行为?

映射的键类型为&String。我们称其寿命为&'a String

entry()方法可能需要将键插入映射(这是入口API的整个思想)。因此,它采用与键相同的类型,即&'a String

当你借s时,你需要借到'a,这样你才能从它那里得到&'a String。所以,你可以为'a可变地借用它。

但是下一次循环执行时,当'a仍然是活动的(因为映射仍然是活的),你再次为'a借用s,而它已经为'a可变地借用了,所以你不能在那段时间内借用它。这是错误。

你可能想要一个String的映射(而不是&String),或者,即使你想要引用,你可以代替window.entry(&mut s);去做window.entry(&s);,然后它就会工作,因为你可以多次借用共享引用的值。

最新更新