¿Cómo actualizar-o-insertar en un Vec?
Estoy escribiendo una estructura de datos en Rust. Contiene unVec
de pares clave-valor. Al insertar en la estructura, necesito encontrar una clave coincidente y actualizar tanto la clave como el valor (que en realidad es un puntero secundario). El código se parece un poco a esto, dondepivots
es unref mut
aVec<Pivot>
yPivot
es solo una estructura con dos 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
}
Pero hay un problema. Aunque no uso el iterador mutable en el segundo brazo delmatch
, el verificador de préstamos se queja de que "no puedo pedir prestado*pivots
como mutable más de una vez a la vez ".
Esto tiene mucho sentido para mí, porque el primer préstamo todavía está en el alcance, a pesar de que no se utiliza en ese casomatch
. Es un poco incómodo: un corrector más inteligente ciertamente podría decir que los préstamos no se superponen. He visto a alguien en línea que aconseja utilizar el retorno temprano para evitar el problema, como este:
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 /* ... */)
pero esto parece difícil de entender, especialmente cuando significa dividir este código en su propia función para permitirreturn
. ¿Hay alguna forma más idiomática de realizar la operación de actualización o inserción?