async 块中的 ? 运算符

和在 async fn 中一样, 在 async 块中使用 ? 是很寻常的. 然而, async 块的返回类型不是被显式声明的. 这会导致编译器不能推断 async 块的错误类型.

如下面的代码:

#![allow(unused)] fn main() { struct MyError; async fn foo() -> Result<(), MyError> { Ok(()) } async fn bar() -> Result<(), MyError> { Ok(()) } let fut = async { foo().await?; bar().await?; Ok(()) }; }

会触发这个错误:

error[E0282]: type annotations needed --> src/main.rs:5:9 | 4 | let fut = async { | --- consider giving `fut` a type 5 | foo().await?; | ^^^^^^^^^^^^ cannot infer type

不幸的是, 现在还不能"给 fut 一个类型", 也没有办法 显式地指定 async 块的返回类型. 要解决这个问题, 你可以使用"涡轮运算符"来为块 async 提供成功和错误时的类型:

#![allow(unused)] fn main() { struct MyError; async fn foo() -> Result<(), MyError> { Ok(()) } async fn bar() -> Result<(), MyError> { Ok(()) } let fut = async { foo().await?; bar().await?; Ok::<(), MyError>(()) // <- note the explicit type annotation here }; }