我刚刚开始学习铁 rust ,发现了一种看起来很奇怪的HashMap's entry() method岁行为.在下面的示例中,该方法采用可变引用并返回Entry enum.我甚至没有捕获和持久化返回值.但borrow 判断器似乎认为在下一次迭代开始时,对"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

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

推荐答案

该 map 的密钥类型为&String.让我们称之为终生&'a String.

entry()方法可能需要将键插入到映射中(这就是Entry API的全部思想).因此,它采用与密钥相同的类型,即&'a String.

当你借入s英镑时,你需要借到'a英镑,这样你才能从中获得&'a String英镑.所以,你以'a美元的价格借了它.

但是在下一次循环执行时,当'a仍然处于活动状态时(因为贴图仍然处于活动状态),您将再次borrow s,同样是以'a的价格,而它已经以'a的价格可变地borrow 了,因此在此期间您无法borrow 它.这就是错误所在.

你可能想要一个String的 map (不是&String),或者,即使你确实想要引用,你也可以不做window.entry(&mut s);go 做window.entry(&s);,然后它就会起作用,因为你可以多次borrow 一个值来共享引用.

Rust相关问答推荐

在rust中如何修改一个盒装函数并将其赋回?

使用元组执行条件分支的正确方法

如何处理动态 struct 实例化?

获取字符串切片(&;str)上的切片([ia..ib])返回字符串

在Rust中有没有办法在没有UB的情况下在指针和U64之间进行转换?

你能在Rust中弃用一个属性吗?

如何实现Deref;多次;?

有没有一种方法可以创建一个闭包来计算Rust中具有随机系数的n次多项式?

我可以解构self 参数吗?

如何将一个矩阵的列分配给另一个矩阵,纳尔代数?

Google chrome 和 Apple M1 中的计算着色器

如何使用 Rust Governor 为每 10 秒 10 个请求创建一个 RateLimiter?

仅当函数写为闭包时才会出现生命周期错误

具有在宏扩展中指定的生命周期的枚举变体数据类型

如何在 Rust 中将 bson::Bson 转换为 Vec

在构建器模式中捕获 &str 时如何使用生命周期?

返回引用字符串的future

Rust - 在线程之间不安全地共享没有互斥量的可变数据

当特征函数依赖于为 Self 实现的通用标记特征时实现通用包装器

A 有一个函数,它在 Option<> 类型中时无法编译,但在 Option<> 类型之外会自行编译.为什么?