Saltar al contenido

Tipos propios, no prestados

Por qué un comando asíncrono no puede recibir un `&str`, qué es exactamente lo que el compilador rechaza, y por qué esa restricción —que parece una molestia— es la misma que impide una clase entera de errores.

El error

Rust
// Esto NO compila.#[tauri::command]async fn buscar(termino: &str) -> Vec<Resultado> { … }
TXT
error: lifetime may not live long enough  ... `termino` has lifetime `'1` but it is used here in a future      that may outlive the borrow

Y la versión que sí compila cambia una palabra:

Rust
#[tauri::command]async fn buscar(termino: String) -> Vec<Resultado> { … }

Por qué

Recuerda lo que el nivel 14.1 dijo: el atributo genera una envoltura que deserializa los argumentos y llama a tu función. Esa envoltura crea los datos y se los pasa.

Es exactamente el mismo razonamiento que impide devolver una referencia a una variable local, aplicado a la suspensión. No es una regla de Tauri: es el borrow checker haciendo su trabajo, y en un comando síncrono —que no se suspende— el &str sí compila.

Qué cuesta la versión correcta

Una copia de la cadena. En la práctica, nada: los argumentos de un comando vienen de deserializar JSON, así que ya se ha construido un valor propio de todas formas; usar String no añade una copia, evita una indirección.

Donde sí conviene pensarlo es en el retorno, y ahí la regla es la misma por otro motivo: lo que devuelves se serializa, y serializar necesita leer el dato, así que devolver propio es lo natural.

La regla completa

No es solo de cadenas. Aplica a cualquier tipo prestado:

La excepción son los argumentos inyectados. El estado compartido llega como un tipo del framework que sí es una especie de préstamo, y funciona porque el framework se ocupa de que viva lo suficiente. Ahí hay una trampa distinta —sostenerlo a través de un await— y es el nivel 16.5.