如何在Rust中实现HashMap上具有突变的嵌套循环?

我有以下(修剪)Rust代码:

use std::collections::HashMap;

struct Node {
    weight:   f64,
    outbound: f64,
}

struct Graph {
    edges: HashMap<u32, HashMap<u32, f64>>,
    nodes: HashMap<u32, Node>,
}

impl Graph {
    fn mutate(&mut self) {
        for (key, value) in self.nodes.iter() {
            if self.edges.contains_key(key) {
                for (target, weight) in self.edges[key].iter() {
                    self.nodes.entry(*target).or_insert(Node::new()).weight;
                }
            }
        }
    }
}

但是,由于Rust所有权规则(playground),我无法获取编译代码:

graph.rs:88:25: 88:35 error: cannot borrow `self.nodes` as mutable because it is also borrowed as immutable [E0502]
graph.rs:88                         self.nodes.entry(*target).or_insert(Node::new()).weight;
                                    ^~~~~~~~~~

如果我改变第一个循环使用HashMap :: iter_mut()代替,我得到一个不同的错误(playground):

graph.rs:88:25: 88:35 error: cannot borrow `self.nodes` as mutable more than once at a time [E0499]
graph.rs:88                         self.nodes.entry(*target).or_insert(Node::new()).weight;
                                    ^~~~~~~~~~

如何在Rust中实现这种具有突变的嵌套循环?

最佳答案 在迭代数据结构时,不能插入或删除数据结构中的元素.

据我所知,Rust迭代器也不支持修改(如Java迭代器的remove()).

所以你留下这些选择:

>如果只有少量修改,您可以收集它们并在迭代完成后执行它们.
>如果大多数数据结构被修改,或者它足够小以致复制开销无关紧要,您可以创建一个新的,修改过的数据结构,在迭代后替换原始数据结构.这通常是惯用的解决方案,在map,flat_map或filter等迭代器上使用高阶函数.

点赞