? in async Blocks
Just as in async fn, it's common to use ? inside async blocks.
However, the return type of async blocks isn't explicitly stated.
This can cause the compiler to fail to infer the error type of the
async block.
For example, this code:
# #![allow(unused_variables)] #fn main() { let fut = async { foo().await?; bar().await?; Ok(()) }; #}
will trigger this error:
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
Unfortunately, there's currently no way to "give fut a type", nor a way
to explicitly specify the return type of an async block.
To work around this, use the "turbofish" operator to supply the success and
error types for the async block:
# #![allow(unused_variables)] #fn main() { let fut = async { foo().await?; bar().await?; Ok::<(), MyError>(()) // <- note the explicit type annotation here }; #}