Rust

Any donation is very welcome
Fork me on GitHub

I. Les bases de la programmation en Rust

6. if let / while let

C'est la suite directe du cours précédent. Ce chapitre est court mais très pratique.

Qu'est-ce que le if let ?

Le if let permet de simplifier certains traitements de pattern matching. Prenons un exemple :

Runfn fais_quelque_chose(i: i32) -> Option<String> {
    if i < 10 {
        Some("variable inférieure à 10".to_owned())
    } else {
        None
    }
}

Normalement, pour vérifier le retour de cette fonction, vous utiliseriez un match :

Runmatch fais_quelque_chose(1) {
    Some(s) => println!("{}", &s),
    None => {} // rien à afficher donc on ne fait rien
}

Hé bien avec le if let vous pouvez faire :

Runif let Some(s) = fais_quelque_chose(1) {
    println!("{}", &s)
}

Et c'est tout. Pour faire simple, si le type renvoyé par la fonction fais_quelque_chose correspond à celui donné au if let, le code du if sera exécuté. On peut bien évidemment le coupler avec un else :

Runif let Some(s) = fais_quelque_chose(1) {
    println!("{}", &s)
} else {
    println!("il ne s'est rien passé")
}

Essayez en passant un nombre supérieur à 10 comme argument, vous devriez rentrer dans le else.

D'ailleurs, je ne l'ai pas précisé dans le chapitre précédent mais il est possible d'être plus précis dans le pattern matching. Par-exemple :

Runlet x = Some(10);

if let Some(10) = x {
    // faire quelque chose
} else if let Some(11) = x {
    // ...
}

Vous pouvez bien évidemment le faire sur autant de "niveaux" que vous le souhaitez :

Runlet x = Ok(Some(Ok(Ok(2))));

if let Ok(Some(Ok(Ok(2)))) = x {
    // ...
}

while let

Le while let fonctionne de la même façon : tant que le type renvoyé correspondra au type attendu, la boucle continuera. Donc le code suivant :

Runlet mut v = vec!(1, 2, 3);

loop {
    match v.pop() {
        Some(x) => println!("{}", x),
        None => break,
    }
}

Deviendra :

Runlet mut v = vec!(1, 2, 3);

while let Some(x) = v.pop() {
    println!("{}", x);
}