¡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!
¡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!