我刚刚开始学习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);
,然后它就会工作,因为你可以多次借用共享引用的值。