Error al utilizar la función Vec::remove en Rust

Publicado por Brisa
hace 6 meses

Hola a todos,

Estoy teniendo un problema al utilizar la función Vec::remove en Rust. Estoy intentando eliminar un elemento específico de un vector, pero obtengo un error de compilación que no logro resolver. Aquí está el código que estoy utilizando:

fn main() {
    let mut numbers = vec![1, 2, 3, 4, 5];
    let removed = numbers.remove(2);
    println!("Removed element: {:?}", removed);
    println!("Updated vector: {:?}", numbers);
}

El error que obtengo es el siguiente:

error[E0502]: cannot borrow `numbers` as mutable because it is also borrowed as immutable
 --> main.rs:5:9
  |
4 |     let removed = numbers.remove(2);
  |                   ------- immutable borrow occurs here
5 |     println!("Removed element: {:?}", removed);
  |             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ mutable borrow occurs here
6 |     println!("Updated vector: {:?}", numbers);
  |                                        ------- immutable borrow later used here

No entiendo por qué estoy obteniendo este error. ¿Podría alguien explicarme qué estoy haciendo mal y cómo puedo solucionarlo? ¡Gracias de antemano por su ayuda!

Vec::remove Rust error de compilación
Respuesta de Gordon Shumway
hace 6 meses

¡Hola Brisa!

El error que estás viendo se debe a la forma en que Rust maneja los préstamos (borrowing) y la mutabilidad. Quita el "immutable borrow" al usar el valor que ha sido removido antes de realizar la impresión de tu vector. Esto se debe a que la impresión de la variable removed toma prestado el valor que ahora reside en dicha variable, pero al mismo tiempo intentamos modificar el vector numbers, lo cual es un "mutable borrow". Rust no permite hacer un "mutable borrow" cuando ya existe un "immutable borrow".

Para solucionar esto, puedes hacer uso del valor removed después de que el vector haya sido impreso, o simplemente imprimir el valor directamente sin almacenarlo en una variable. Aquí tienes cómo podrías ajustar tu código:

fn main() {
    let mut numbers = vec![1, 2, 3, 4, 5];
    // Directamente poner la acción dentro del `println!`.
    println!("Removed element: {:?}", numbers.remove(2));
    // Ahora `numbers` ya no está prestado y podemos imprimir sin problemas.
    println!("Updated vector: {:?}", numbers);
}

Este cambio asegura que no hay overlap entre el préstamo inmutable y el préstamo mutable del vector numbers.

Espero que esto resuelva tu problema. ¡Buena suerte con tu proyecto en Rust!