TuB*_*ent 2 rust borrow-checker
考虑以下代码(最小示例):
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];
}
}
Run Code Online (Sandbox Code Playgroud)
借阅检查员会抱怨:
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];
}
}
Run Code Online (Sandbox Code Playgroud)
但是,在这种情况下,我可以确定我所做的更改不会干扰不可变引用。For Vec,我会split_at_mut在这里使用-HashMap在 Rust 中是否有等效的 for ?
编辑:
正如评论指出的那样,让我更具体地说明我要解决的问题。我想将图中的顶点“合并”到一个顶点中。为此,我创建了一个HashMap:
pub mergedVerticesList: HashMap<usize, HashSet<usize>>
Run Code Online (Sandbox Code Playgroud)
它应该从一个顶点映射到所有已合并到该顶点的顶点。由于这可以递归完成,因此在撤消u和之间的合并时,merge_onto我想删除merge_onto由于ufrommerge_onto的所有已合并的顶点HashSet。因此,代码如下所示:
for i in self.mergedVerticesList[v].iter() {
self.mergedVerticesList.get_mut(&merge_onto).unwrap().remove(i);
}
Run Code Online (Sandbox Code Playgroud)
不,就目前HashMap而言,这是不可能的。您可以将单元格作为值来重新获得可变访问权限,但我强烈建议不要这样做。您不能将更改移出循环(它还可以从每次迭代的重复查找中保存)。有什么好听的
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);
let s = map.iter().filter_map(|(k, v)| if *k != 3 { Some(v) } else { None }).sum::<i128>();
*map.get_mut(&3).unwrap() += s;
println!("{:#?}", &map)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
135 次 |
| 最近记录: |