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 }; }