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블록에 성공과 에러의 타입을 제공하기 위해 아래와 같이 "turbofish" 연산자를 사용하세요.


#![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>(()) // <- 이 곳의 명시적 타입 주해에 유의할 것.
};
}