Rust 中带问号的等待(await?)是什么?

Fin*_*ber 6 error-handling rust async-await

我读了关于 Rust 异步编程的书的这一部分https://rust-lang.github.io/async-book/03_async_await/01_chapter.html

我看到提到语法.await

然后我后来看到一个博客,其中reqwest用于获取网址。代码如下所示:

let resp200 = client.get("https://httpbin.org/ip")
    .header(CONTENT_TYPE, "application/json")
    .send()
    .await?
    .json::<GETAPIResponse>()
    .await?;
Run Code Online (Sandbox Code Playgroud)

我不明白.await?。我知道是提取案例或从带有错误的函数返回的?简写。Ok但据我所知,.await不会返回Result,所以怎么可能.await?

cam*_*024 6

.await简单地将 aimpl Future<Output = T>变成 aT

?(大部分)将 a 变成Result<T, E>aT

当放在一起时,.await?将 aimpl Future<Output = Result<T, E>>变成 aT

以下代码是等效的:

let future = client.get("https://httpbin.org/ip")
    .header(CONTENT_TYPE, "application/json")
    .send();
let result: Result<_, _> = future.await;
let response: Response = result?;
let json_future = response.json();
let json_response: Result<_, _> = json_future.await;
let json = json_response?;
Run Code Online (Sandbox Code Playgroud)

但是,.await?并不是特殊的运算符。它实际上只是.await紧随其后?