【发布时间】:2020-10-03 17:27:44
【问题描述】:
考虑以下代码(最小示例):
use std::collections::HashMap;
fn main() {
let mut map: HashMap<usize, i128> = HashMap::new();
map.insert(1, -5);
map.insert(2, 6);
map.insert(3, 7);
for i in map.keys() {
if *i == 3 {
continue;
}
*map.get_mut(&3).unwrap() += map[i];
}
}
借用检查器会抱怨:
cannot borrow `map` as mutable because it is also borrowed as immutable
但是,在这种情况下,我可以确定我所做的突变不会干扰不可变引用。对于Vec,我会在这里使用split_at_mut - 在Rust 中是否有与HashMap 对应的等效项?
编辑:
正如评论所指出的,让我更具体地说明我要解决的问题。我想将图中的顶点“合并”为一个顶点。为此我创建了一个HashMap:
pub mergedVerticesList: HashMap<usize, HashSet<usize>>
它应该从一个顶点映射到已合并到该顶点的所有顶点。由于这可以递归地完成,当撤消u 和merge_onto 之间的合并时,我想从merge_onto 的HashSet 中删除由于u 而合并到merge_onto 的所有顶点。因此,代码如下所示:
for i in self.mergedVerticesList[v].iter() {
self.mergedVerticesList.get_mut(&merge_onto).unwrap().remove(i);
}
【问题讨论】:
-
您要在这里解决的真正问题是什么?我有一种感觉,这是XY problem 的一个示例,并且可能有更好的方法来解决实际问题,而不是您在这里尝试做的事情。
-
谢谢,这是一个很好的观点。我编辑了这个问题,希望让它更清楚。
标签: rust borrow-checker