🚧 Attention, peinture fraîche !

Cette page a été traduite par une seule personne et n'a pas été relue et vérifiée par quelqu'un d'autre ! Les informations peuvent par exemple être erronées, être formulées maladroitement, ou contenir d'autres types de fautes.

Vous pouvez contribuer à l'amélioration de cette page sur sa Pull Request.

? dans les blocs async

Tout comme dans async fn, il est courant d'utiliser ? dans des blocs async. Cependant, le type de retour des blocs async n'a pas d'état explicite. Cela peut faire échouer le compilateur à déduire le type d'erreur du bloc async.

Par exemple, ce code ...


#![allow(unused)]
fn main() {
struct MonErreur;
async fn alpha() -> Result<(), MonErreur> { Ok(()) }
async fn beta() -> Result<(), MonErreur> { Ok(()) }
let future = async {
    alpha().await?;
    beta().await?;
    Ok(())
};
}

... va déclencher cette erreur :

error[E0282]: type annotations needed
 -- > src/main.rs:5:9
  |
4 |     let future = async {
  |         ------ consider giving `fut` a type
5 |         alpha().await?;
  |         ^^^^^^^^^^^^^^ cannot infer type

Malheureusement, il n'existe pas pour l'instant de façon de "donner un type à future", ni une manière pour préciser explicitement le type de retour d'un bloc async. Pour contourner cela, utilisez l'opérateur "turbofish" pour renseigner les types de succès et d'erreur pour le bloc async :


#![allow(unused)]
fn main() {
struct MonErreur;
async fn alpha() -> Result<(), MonErreur> { Ok(()) }
async fn beta() -> Result<(), MonErreur> { Ok(()) }
let future = async {
    alpha().await?;
    beta().await?;
    Ok::<(), MonErreur>(()) // <- remarquez l'annotation de type explicite ici
};
}