#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>
, чтобы подчеркнуть добавленные ключевые слова.