Acheter version papier

Rust

Fork me on GitHub

I. Les bases de la programmation en Rust

7. Les expressions

Il faut bien comprendre que Rust est un langage basé sur les expressions. Avant de bien pouvoir vous les expliquer, il faut savoir qu'il y a les expressions et les déclarations. Leur différence fondamentale est que la première retourne une valeur alors que la seconde non. C'est pourquoi il est possible de faire ceci :

Runlet var = if true {
    1u32
} else {
    2u32
};

Mais pas ça :

Runlet var = (let var2 = 1u32);

C'est tout simplement parce que le mot-clé let introduit une assignation et ne peut donc être considéré comme une expression. C'est donc une déclaration. Ainsi, il est possible de faire :

Runlet mut var = 0i32;
let var2 = (var = 1i32);

Car (var = 1i32) est considéré comme une expression.

Attention cependant, une assignation de valeur retourne le type () (qui est un tuple vide. Pour rappel, son équivalent le plus proche en C/C++ est le type void comme expliqué dans le chapitre précédent) et non la valeur assignée contrairement à un langage comme le C par exemple.

Un autre point important d'une expression est qu'un point-virgule marquera toujours sa fin. Démonstration :

Runlet var: u32 = if true {
    1u32;
} else {
    2u32;
};

Il vous dira à ce moment-là que le if else renvoie '()' et donc qu'il ne peut pas compiler car il attendait un entier car j'ai explicitement demandé au compilateur de créer une variable var de type u32.

Je pense à présent que vous avez un bon aperçu de ce que sont les expressions. Il est très important que vous compreniez bien ce concept pour pouvoir aborder la suite de ce cours sereinement. Voici un exemple d'une fonction qui n'est composée que d'une expression :

Runfn test_expression(x: i32) -> i32 {
    if x < 0 {
        println!("{} < 0", x);
        -1
    } else if x == 0 {
        println!("{} == 0", x);
        0
    } else {
        println!("{} > 0", x);
        1
    }
}

Tout comme pour les if/else, il est possible de retourner une valeur d'un pattern matching et donc de la mettre directement dans une variable. Du coup, le ';' est nécessaire pour terminer ce bloc :

Runlet my_string = "hello";

let s = match my_string {
    "bonjour" => "français",
    "ciao" => "italien",
    "hello" => "anglais",
    "hola" => "espagnol",
    _ => "je ne connais pas cette langue..."
}; // on met un ';' ici car ce match retourne un type

println!("{}", s);

Essayez le code suivant si vous avez encore un peu de mal à comprendre :

Runfn main() {
    if 1 == 2 {
        "2"
    } else {
        "1"
    }
    println!("fini");
}