Error al utilizar el operador await en Rust

Publicado por Brisa
hace 4 meses

¿Por qué recibo un error "mismatched types" cuando intento utilizar el operador await en un programa en Rust?

Código fuente:

use async_std::task;

async fn greet() -> String {
    "Hello".to_string()
}

async fn run() {
    let greeting = greet().await;
    println!("{}", greeting);
}

fn main() {
    task::block_on(run());
}

Error obtenido:

error[E0308]: mismatched types
 --> src/main.rs:9:29
  |
9 |     let greeting = greet().await;
  |                             ^^^^^ one type is expected, found opaque type
  |
  = note: expected enum `std::option::Option<std::string::String>`
             found opaque type `impl std::future::future::Future`

Descripción detallada: Estoy tratando de utilizar el operador await en un programa en Rust para esperar a que una función asíncrona se complete antes de continuar. Sin embargo, cuando intento ejecutar el programa, obtengo el siguiente error: "mismatched types". El error se produce en la línea donde utilizo el operador await para asignar el resultado de la función greet() a la variable greeting.

No entiendo por qué estoy obteniendo este error de tipos incompatibles. He definido la función greet() como asíncrona y he declarado la función run() como asíncrona también. ¿Qué estoy haciendo mal? ¿Cómo puedo solucionar este error y utilizar correctamente el operador await en Rust?

Rust async await
Respuesta de Gordon Shumway
hace 4 meses

¡Hola Brisa!

Revisando tu código y el error que has proporcionado, me parece que el problema está en que tu función greet está correctamente definida y retorna un String, pero el tipo de error sugiere que hay una expectativa de un Option<String>. Sin embargo, el mensaje de error indica que el tipo esperado no parece ser el problema en este caso. El error menciona que se encontró un tipo opaco en lugar de una cadena (o String).

Aquí está tu problema: en Rust, para que el compilador pueda manejar el .await, la función que contiene el .await necesita ser llamada dentro de un contexto async. Tú has hecho esto correctamente con run(). Sin embargo, el error de "mismatched types" no debería ocurrir si run y greet están definidos como async de manera correcta.

Es posible que haya una confusión o malinterpretación del mensaje de error. Probablemente se deba a otra parte del código que no esté mostrada aquí. El uso de .await y las definiciones de las funciones async están correctas, y no deberían causar un error de tipos incompatibles.

El código proporcionado, tal como está, debería compilar y funcionar correctamente, dándote la salida de "Hello" cuando ejecutas el programa. Si sigues recibiendo un error de "mismatched types", podría deberse a otra parte del código que no se ha incluido en el fragmento compartido.

Asegúrate de que no estás llamando a greet() en otra parte de tu código donde se espera un Option<String> o algún otro tipo. Además, comprueba que no tienes versiones antiguas del compilador o bibliotecas que podrían estar causando un conflicto.

Si todo lo demás falla, intenta crear un nuevo proyecto y copiar exactamente el mismo código para ver si el error persiste. Si lo hace, considera actualizar tu compilador Rust y tus dependencias a las versiones más recientes, y asegúrate de que no haya conflictos con otras partes de tu código.

Espero que esto ayude a solucionar el problema. ¡Mucho éxito con tu programación en Rust!