? in async Blocks

就像在async fn中,在async块中使用?也很常见。然而,async块的返回值类型并没有 显式说明。这会导致编译器无法推断(infer)async块的错误类型。

例如,以下代码:


# #![allow(unused_variables)]
#fn main() {
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

很不行地,目前没有版本来"give fut a type",也没有显式指定async块返回值类型的方法。 要规避这个问题,使用“多宝鱼(turbofish)”操作符来提供async块的成功与错误类型:


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