? в async блоках

Как и в async fn, ? также может использоваться внутри async блоков. Однако возвращаемый тип async блоков явно не указывается. Это может привести тому, что компилятор не сможет определить тип ошибки async блока.

Например, этот код:


#![allow(unused)]
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

К сожалению, сейчас не способа "задать тип для fut" кроме как явно указать возвращаемый тип async блока. Для обработки этого, используйте "turbofish" оператор для предоставления типов ошибки и успеха async блока:


#![allow(unused)]
fn main() {
let fut = async {
    foo().await?;
    bar().await?;
    Ok::<(), MyError>(()) // <- обратите внимание на явное указание типа
};
}