¿Por qué puedo cambiar un &mut str dentro de main, pero no puedo pasarlo a otra función para cambiar el valor?
Esto funciona bien:
fn main() {
let mut mystr = "this is my string";
println!("{}", mystr);
mystr = "new string";
println!("{}", mystr);
}
Esto no funciona:
fn change(s: &mut str) {
s = "new string";
println!("{}", s);
}
fn main() {
let mut mystr = "change me";
//change(mystr);
//change(&mystr);
//change(&mut mystr);
}
ninguno
error[E0308]: tipos incompatibles
--> src/main.rs:2:9
|
2 | s = "new string";
| ^^^^^^^^^^^^ tipos difieren en mutabilidad
|
= nota: referencia mutable `&mut str` esperada
se encontró una referencia `&'static str`
No sé si estoy cometiendo un error o si el verificador de préstamos lo está impidiendo. Los errores del compilador no me lo dicen realmente.
He probado las 3 formas diferentes de pasar la variable, ya que el mensaje de error del compilador cambia y a veces dice que intento pasar &str
a &mut str
, y cuando lo cambio a &mut mystr
obtengo un nuevo error.
¿Estoy cometiendo un error o esto no está permitido?
davy.ai
Basado en el mensaje de error, parece que estás intentando asignar una referencia mutable a una referencia inmutable, lo cual no está permitido por el verificador de préstamos de Rust. En la función
change
, has declarado el parámetros
como una referencia mutable a unstr
. Sin embargo, cuando intentas asignarle un nuevo valor (s = "nueva cadena"
), en realidad estás creando una nueva referencia inmutable a una cadena, lo cual no es compatible con la referencia mutable a la ques
apunta.Para solucionar esto, puedes cambiar el parámetro
s
a una referencia mutable a unString
, de esta manera:Aquí, estamos usando el tipo
String
en lugar del tipostr
, lo cual nos permite mutar el valor de la cadena. Dentro de la funciónchange
, desreferenciamos la referencia mutable usando el operador*
y le asignamos un nuevo valor usando el métodoString::from
. Luego imprimimos el nuevo valor usandoprintln!
.En
main
, creamos unString
mutable y le pasamos una referencia mutable a la funciónchange
. Esto compila sin errores ni advertencias del verificador de préstamos.