预期的不透明类型,找到枚举 `Result`

当我想像这样在 rust 中匹配函数的结果时:

#[get("/v1/user")]
pub fn user_info(){
    match get_user_info(16){
        Ok(sk) => {
            info!("get user info success:" + sk)
        },
        Err(e) => {
            info!("error:" + e)
        },
    }
}

显示如下错误:

error[E0308]: mismatched types
  --> src/biz/music/test_controller.rs:53:9
   |
53 |         Ok(sk) => {
   |         ^^^^^^ expected opaque type, found enum `Result`
   |
note: while checking the return type of the `async fn`
  --> src/common/net/rest_client.rs:4:50
   |
4  | pub async fn get_user_info(input_user_id:i64) -> Result<(), Box<dyn std::error::Error>> {
   |                                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ checked the `Output` of this `async fn`, expected opaque type
   = note: expected opaque type `impl std::future::Future`
                     found enum `Result<_, _>`

error[E0308]: mismatched types
  --> src/biz/music/test_controller.rs:57:9
   |
57 |         Err(e) => {
   |         ^^^^^^ expected opaque type, found enum `Result`
   |
note: while checking the return type of the `async fn`
  --> src/common/net/rest_client.rs:4:50

这是我的 get_user_info 函数:

pub async fn get_user_info(input_user_id:i64) -> Result<(), Box<dyn std::error::Error>> {
    let url = "http://dolphin-post-service.reddwarf-pro.svc.cluster.local:11014/post/user/";
    let uid = string_to_static_str(input_user_id.to_string());
    let resp = reqwest::get(format!("{}{}", url, uid))
        .await?
        .json::<HashMap<String, String>>()
        .await?;
    println!("{:#?}", resp);
    Ok(())
}

如何解决这个问题,我从网上搜索并告诉我该函数是返回一个Future,但我没有在rust中找到 await 关键字,如何处理这种情况?我应该怎么做才能让它工作?

stack overflow expected opaque type, found enum `Result`
原文答案
author avatar

接受的答案

async fn 返回的值是 **Future**Future is 一个可以产生值的异步计算(尽管该值可能为空,例如())。同样在 async fn 内部,您可以使用 .await 等待实现 Future 特征的另一种类型的完成。

get_user_info 是一个异步函数(返回未来)。因此,要获得实际结果,您必须使用 await ,它将等待 get_user_info 的完成

pub **async** fn user_info(){
    match **get_user_info(16).await** {
        Ok(()) => {
            dbg!("get user info success:");
        },
        Err(e) => {
            dbg!("error:");
        },
    }
}

答案: