Problema con el operador &mut en Rust

Publicado por Brisa
hace 5 meses

¡Hola a todos!

Estoy trabajando en un proyecto en Rust y me he encontrado con un problema al utilizar el operador &mut. Estoy tratando de modificar una referencia mutable a un objeto, pero el compilador me muestra un error que no entiendo.

Aquí está mi código:

struct Alumno {
    nombre: String,
    edad: u8,
}

fn cambiar_nombre(alumno: &mut Alumno, nuevo_nombre: String) {
    alumno.nombre = nuevo_nombre;
}

fn main() {
    let mut juan = Alumno {
        nombre: String::from("Juan"),
        edad: 20,
    };

    cambiar_nombre(&mut juan, String::from("Pedro"));

    println!("El nombre del alumno es {}", juan.nombre);
}

Cuando intento compilar este código, obtengo el siguiente error:

error[E0506]: cannot assign to `alumno.nombre`, as `alumno` is not declared as mutable
 --> src/main.rs:8:5
  |
1 | fn cambiar_nombre(alumno: &mut Alumno, nuevo_nombre: String) {
  |                   - help: make this binding mutable: `mut alumno: &mut Alumno`
2 |     alumno.nombre = nuevo_nombre;
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot assign

No entiendo por qué obtengo este error si ya he declarado el parámetro alumno como mutable al utilizar &mut. ¿Alguien puede ayudarme a entender qué estoy haciendo mal?

¡Gracias de antemano por su ayuda!

operador &mut problema
Respuesta de Gordon Shumway
hace 5 meses

¡Hola Brisa!

La explicación del error es bastante sencilla. Aunque efectivamente pasas a la función cambiar_nombre una referencia mutable al Alumno, te falta declarar el parámetro alumno dentro de la función como mutable. Esto es necesario porque en Rust, todas las variables son inmutables por defecto, a menos que explícitamente se indiquen como mutables, incluso si son referencias mutables.

La solución es declarar el parámetro de la función con mut antes del nombre del parámetro, así:

fn cambiar_nombre(mut alumno: &mut Alumno, nuevo_nombre: String) {
    alumno.nombre = nuevo_nombre;
}

Con eso indicas que quieres modificar la Alumno a la que alumno hace referencia dentro de la función. Aquí está tu ejemplo corregido:

struct Alumno {
    nombre: String,
    edad: u8,
}

fn cambiar_nombre(mut alumno: &mut Alumno, nuevo_nombre: String) { // Añadido `mut` aquí
    alumno.nombre = nuevo_nombre;
}

fn main() {
    let mut juan = Alumno {
        nombre: String::from("Juan"),
        edad: 20,
    };

    cambiar_nombre(&mut juan, String::from("Pedro"));

    println!("El nombre del alumno es {}", juan.nombre);
}

Con este cambio, tu código debería compilar y funcionar correctamente.

¡Espero que esto aclare tus dudas y puedas seguir adelante con tu proyecto en Rust!