Como atualizar ou inserir em um Vec?
Estou escrevendo uma estrutura de dados no Rust. Contém umVec
de pares de valores-chave. Ao inserir na estrutura, preciso encontrar uma chave correspondente e atualizar a chave e o valor (que na verdade é um ponteiro filho). O código se parece um pouco com isso, ondepivots
é umref mut
paraVec<Pivot>
ePivot
é apenas uma estrutura com dois campos:
match pivots.iter_mut().find(|ref p| key <= p.min_key) { // first mutable borrow
Some(ref mut pivot) => {
// If there is one, insert into it and update the pivot key
pivot.min_key = key;
pivot.child.insert(key, value) // recursive call
},
// o/w, insert a new leaf at the end
None => pivots.push(Pivot /* ... */) // second mutable borrow
}
Mas há um problema. Mesmo que eu não use o iterador mutável no segundo braço domatch
, o verificador empresta que "eu não posso emprestar*pivots
mutável mais de uma vez de cada vez ".
Isso faz todo o sentido para mim, porque o primeiro empréstimo ainda está no escopo, mesmo que não seja usado nesse caso domatch
. É um pouco inconveniente: um verificador mais inteligente certamente poderia dizer que os empréstimos não se sobrepõem. Eu vi alguém online aconselhando o retorno antecipado para evitar o problema, assim:
match pivots.iter_mut().find(|ref p| key <= p.min_key) {
Some(ref mut pivot) => {
pivot.min_key = key;
pivot.child.insert(key, value);
return
},
None => ()
};
pivots.push(Pivot /* ... */)
mas isso parece difícil de entender, especialmente quando significa quebrar esse código em sua própria função para permitir que oreturn
. Existe uma maneira mais idiomática de executar a operação de atualização ou inserção?