es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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?

Tags:  , ,

Answer

  1. Avatar for 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ámetro s como una referencia mutable a un str. 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 que s apunta.

    Para solucionar esto, puedes cambiar el parámetro s a una referencia mutable a un String, de esta manera:

    fn change(s: &mut String) {
        *s = String::from("nueva cadena");
        println!("{}", s);
    }
    
    fn main() {
        let mut mystr = String::from("cámbiame");
        change(&mut mystr);
    }
    

    Aquí, estamos usando el tipo String en lugar del tipo str, lo cual nos permite mutar el valor de la cadena. Dentro de la función change, desreferenciamos la referencia mutable usando el operador * y le asignamos un nuevo valor usando el método String::from. Luego imprimimos el nuevo valor usando println!.

    En main, creamos un String mutable y le pasamos una referencia mutable a la función change. Esto compila sin errores ni advertencias del verificador de préstamos.

Comments are closed.