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
}

Et 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);
}