ожидаемый непрозрачный тип, найдено перечисление `Результат`

#rust

Вопрос:

когда я хочу сопоставить результат функции в 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(())
}
 

как решить эту проблему, я ищу в Интернете и говорю мне, что функция возвращает будущее, но я не нашел await ключевого слова в rust, как справиться с этой ситуацией? что я должен сделать, чтобы это сработало?

Ответ №1:

Возвращаемое значение async fn -это будущее. Будущее-это асинхронное вычисление, которое может создать значение (хотя это значение может быть пустым, например ()). Также внутри an async fn вы можете использовать .await для ожидания завершения другого типа , реализующего будущую черту.

Так get_user_info же как и асинхронная функция(которая возвращает будущее). Таким образом, чтобы получить фактический результат, вы должны использовать await , который будет ждать завершения get_user_info

pub async fn user_info(){
соответствует get_user_info(16).ожидание {
 Ок(()) => {
dbg!("успешно получить информацию о пользователе:");
 },
Err(e) => {
dbg!("ошибка:");
 },
 }
}

Комментарии:

1. Хорошее использование <pre> , чтобы подчеркнуть добавленные ключевые слова.