Phase 1Premiers pas

#4 Fonctions et contrôle de flux

fn, if, loop, match

Définir des fonctions

En Rust, les fonctions sont déclarées avec le mot-clé fn. Par convention, les noms de fonctions utilisent le snake_case (minuscules avec underscores).

Fonction simple
fn dire_bonjour() {
    println!("Bonjour depuis ma fonction !");
}

fn main() {
    dire_bonjour();
}

L'ordre de déclaration n'a pas d'importance en Rust : vous pouvez appeler une fonction définie plus bas dans le fichier.

Paramètres et types de retour

Les paramètres doivent toujours avoir un type annoté. Pour retourner une valeur, on utilise la flèche -> suivie du type de retour.

Paramètres et retour
fn additionner(a: i32, b: i32) -> i32 {
    a + b // Pas de ; → c'est la valeur retournée
}

fn main() {
    let resultat = additionner(3, 7);
    println!("La somme de 3 + 7 = {resultat}");
}

Point important : en Rust, la dernière expression d'une fonction (sans point-virgule) est automatiquement retournée. Vous pouvez aussi utiliser return explicitement, mais c'est rarement nécessaire.

if / else

Les conditions en Rust n'utilisent pas de parenthèses autour de la condition (contrairement au C ou Java). Les accolades sont obligatoires.

Conditions
let nombre = 5;

if nombre > 0 {
    println!("{nombre} est positif");
} else if nombre < 0 {
    println!("{nombre} est négatif");
} else {
    println!("{nombre} est zéro");
}

En Rust, if est une expression : il retourne une valeur. On peut l'utiliser directement dans un let :

if comme expression
let x = 5;
let label = if x > 0 { "positif" } else { "négatif ou zéro" };
println!("{label}");

Les boucles

Rust propose trois types de boucles : loop, while et for.

loop — boucle infinie
let mut compteur = 0;

loop {
    compteur += 1;
    println!("Compteur : {compteur}");
    if compteur == 3 {
        break; // Sort de la boucle
    }
}
while — boucle conditionnelle
let mut n = 3;

while n > 0 {
    println!("{n} !");
    n -= 1;
}
println!("Décollage !");
for — itération
// Parcourir un intervalle
for i in 1..=5 {
    println!("{i}");
}

// Parcourir un tableau
let fruits = ["pomme", "banane", "cerise"];
for fruit in fruits {
    println!("{fruit}");
}

L'expression match

match est l'équivalent du switch dans d'autres langages, mais beaucoup plus puissant. Le compilateur vérifie que tous les cas sont couverts.

match
let couleur = "rouge";

let code_hex = match couleur {
    "rouge" => "#FF0000",
    "vert"  => "#00FF00",
    "bleu"  => "#0000FF",
    _       => "#000000", // _ = tous les autres cas
};

println!("Couleur : {couleur} -> {code_hex}");

Le _ est un joker qui capture tous les cas non listés. Sans lui, le compilateur refuserait de compiler si un cas manque.

À vous de jouer

Essayez les commandes ci-dessous pour exécuter les exemples :

terminal — cargo
user@stemlegacy:~/functions-demo$