我刚开始学习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
有人能给我解释一下这种行为吗?
1条答案
按热度按时间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);
,然后它将工作,因为您可以多次借用共享引用的值。