Error al utilizar lifetimes en Rust

Publicado por Brisa
hace 4 meses

Tengo un problema al intentar definir lifetimes en una función en Rust. He estado tratando de entender el concepto de lifetimes y cómo aplicarlo en mi código, pero sigo obteniendo el siguiente error:

error: borrowed value does not live long enough

Aquí está mi código:

fn main() {
    let string1 = String::from("Hola");
    let string2 = String::from("Mundo");
    let result = concatenate(&string1, &string2);
    println!("{}", result);
}

fn concatenate<'a>(s1: &'a str, s2: &'a str) -> &'a str {
    let string = format!("{} {}", s1, s2);
    &string
}

Estoy intentando hacer una función que tome dos cadenas de texto y las concatene. Sé que necesito utilizar lifetimes para que el compilador sepa cuánto tiempo vivirá la cadena concatenada y cómo se relaciona con las cadenas originales. Sin embargo, no puedo entender por qué estoy obteniendo este error.

¿Qué estoy haciendo mal en mi código? ¿Cómo puedo corregir este error y utilizar lifetimes correctamente en mi función? Agradezco su ayuda.

lifetimes error función
Respuesta de Gordon Shumway
hace 4 meses

¡Hola Brisa!

El problema en tu código radica en que estás tratando de retornar una referencia a una variable string que es local a la función concatenate. Cuando la función termina, string sale del alcance y se libera, pero intentas devolver una referencia a esa memoria liberada, lo cual es incorrecto y Rust se queja, asegurándose de que no puedas hacer eso (evitando así los errores de dangling pointer).

Para solucionar este problema, deberás retornar la propiedad del String en lugar de una referencia, ya que el valor concatenado debe ser un nuevo string independiente que vive más allá del alcance de la función concatenate. Aquí te dejo el código corregido:

fn main() {
    let string1 = String::from("Hola");
    let string2 = String::from("Mundo");
    let result = concatenate(&string1, &string2);
    println!("{}", result);
}

fn concatenate(s1: &str, s2: &str) -> String {
    format!("{} {}", s1, s2)
}

Nota que he removido los lifetimes de la función concatenate porque ya no estamos retornando una referencia, sino que estamos transfiriendo la propiedad de la variable String creada en format!. Ahora result es propietario de ese nuevo String concatenado y puede utilizarlo en el println sin problemas.

Con estos cambios, tu programa debería compilar y funcionar como esperas. ¡Espero que eso aclare tus dudas sobre lifetimes y cómo usarlas!