Como posso iterar simultaneamente sobre um Rust HashMap e modificar alguns de seus valores?
Estou tentando o Advent of Code in Rust este ano, como uma maneira de aprender o idioma. Analisei a entrada (desde o dia 7) na seguinte estrutura:
struct Process {
name: String,
weight: u32,
children: Vec<String>,
parent: Option<String>
}
Estes são armazenados em umHashMap<String, Process>
. Agora quero iterar sobre os valores no mapa e atualizar os valores pai, com base no que encontro no vetor "filhos" do pai.
O que não funciona é
for p in self.processes.values() {
for child_name in p.children {
let mut child = self.processes.get_mut(child_name).expect("Child not found.");
child.parent = p.name;
}
}
Não posso ter uma referência mutável aoHashMap
(self.processes
) e uma referência não mutável ou duas referências mutáveis.
Então, qual é a maneira mais idiomática de fazer isso no Rust? As duas opções que posso ver são:
Copie os relacionamentos pai / filho em uma nova estrutura de dados temporária em uma passagem e atualize as estruturas do Processo em uma segunda passagem, depois que a referência imutável estiver fora do escopo.Alterar minha estrutura de dados para colocar "pai" em seu próprio HashMap.Existe uma terceira opção?