Introduction
Une recherche réelle ne trouve pas toujours une valeur. Rust représente cette possibilité avec Option<T> : Some(value) signifie qu’une valeur existe, tandis que None signifie qu’elle n’existe pas. L’absence fait ainsi partie du type, au lieu d’être masquée derrière un nombre inventé ou de risquer de provoquer une panique.
Vous allez terminer un petit outil de génération de rapports d’inventaire. Il gère les stocks trouvés et manquants, distingue un enregistrement existant avec un stock nul de l’absence d’enregistrement, et utilise if let lorsqu’une action est nécessaire uniquement dans le cas où une valeur est présente.
Filtrer les valeurs présentes et manquantes
Dans cette étape, vous allez remplacer un rapport provisoire par un filtrage exhaustif du résultat d’une recherche facultative.
Accédez au projet Cargo préparé :
cd /home/labex/project/option-inventory
Ouvrez son code source :
nano src/main.rs
La fonction find_stock préparée renvoie Option<u32>. Pour le moment, lisez les chevrons comme « une Option qui peut contenir un u32 » ; la définition de types réutilisables avec des paramètres entre chevrons sera abordée plus tard. Some(12) contient une quantité en stock, tandis que None ne contient aucune quantité.
À la fin de la recherche préparée, _ => None utilise le motif générique _. Il signifie « tout code qui n’a pas été reconnu par une branche précédente ». Le motif générique ne crée pas de variable utilisable ; il ignore volontairement la valeur non reconnue et renvoie None.
Dans report, repérez l’instruction println! provisoire et remplacez cette ligne par le filtrage suivant :
match find_stock(code) {
Some(count) => println!("{code}: {count} in stock"),
None => println!("{code}: not found"),
}
Some(count) reconnaît une valeur présente et donne à son nombre interne le nom local count. La branche None traite explicitement l’absence ; le filtrage couvre donc toutes les valeurs possibles de Option<u32>.
Enregistrez avec Ctrl+O, appuyez sur Entrée, puis quittez avec Ctrl+X. Vérifiez le programme avant de l’exécuter :
cargo check
La mention Finished confirme que les deux cas de Option sont couverts. Exécutez maintenant le rapport :
cargo run --quiet
Vous devriez obtenir :
A1: 12 in stock
B2: 0 in stock
Z9: not found
La dernière ligne provient de None ; les deux premières proviennent de Some, y compris la valeur Some(0).
Distinguer zéro de l’absence
Dans cette étape, vous allez donner à un enregistrement existant dont le stock est nul un comportement spécifique, au lieu de traiter zéro comme une valeur manquante.
Some(0) et None ont des significations différentes. Some(0) indique que la recherche a trouvé un enregistrement dont la quantité est zéro. None indique qu’aucun enregistrement n’existe pour ce code. C’est pourquoi un espace réservé tel que 0 ne constitue pas un remplacement sûr de l’absence.
Ouvrez à nouveau le code source :
nano src/main.rs
Dans le filtrage de report, ajoutez cette branche juste au-dessus de la branche Some(count) existante :
Some(0) => println!("{code}: out of stock"),
Les branches sont vérifiées de haut en bas. Le motif spécifique Some(0) doit apparaître avant Some(count), car le motif plus général reconnaît également zéro.
Enregistrez et quittez, puis exécutez le programme :
cargo run --quiet
La sortie doit maintenant être :
A1: 12 in stock
B2: out of stock
Z9: not found
Chaque ligne représente désormais un état distinct : disponible, présent mais vide, ou manquant.
Agir uniquement lorsqu’une valeur existe
Dans cette étape, vous allez utiliser if let pour une tâche qui nécessite une action uniquement lorsqu’une recherche aboutit.
Un match exhaustif convient lorsque chaque cas nécessite un comportement différent. if let PATTERN = VALUE est une condition concise basée sur un motif, adaptée à l’autre situation courante : exécuter un bloc lorsqu’un motif correspond et ne rien faire dans le cas contraire.
Ouvrez le code source :
nano src/main.rs
Ajoutez cette fonction juste au-dessus de main :
fn highlight_available(code: &str) {
if let Some(count) = find_stock(code) {
println!("{code}: {count} available for promotion");
}
}
Le motif ne réussit que pour Some, donc count est disponible à l’intérieur des accolades. Il n’y a pas de bloc else, car cette fonction auxiliaire ne doit volontairement rien afficher pour None.
Dans main, supprimez les caractères // au début de la ligne préparée highlight_available("C3");. Enregistrez et quittez, puis vérifiez et exécutez le programme :
cargo check
cargo run --quiet
La sortie complète doit être :
A1: 12 in stock
B2: out of stock
Z9: not found
C3: 5 available for promotion
La quatrième ligne prouve que if let a extrait la valeur contenue dans Some(5) sans inventer de comportement pour une valeur manquante.
Résumé
Vous avez filtré Some et None, conservé la différence entre Some(0) et l’absence, puis utilisé if let lorsqu’une action était nécessaire uniquement pour une valeur présente.


