🚧 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 }; }