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
// Esto NO compila.#[tauri::command]async fn buscar(termino: &str) -> Vec<Resultado> { … }error: lifetime may not live long enough ... `termino` has lifetime `'1` but it is used here in a future that may outlive the borrowY la versión que sí compila cambia una palabra:
#[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.