Représenter « une valeur, ou une erreur »
En C, trois réponses coexistent, et aucune n'oblige l'appelant à vérifier : une valeur sentinelle
(-1, NULL), un code d'erreur, ou errno. Les types
somme, eux, font de l'échec un cas du type :
// Rust : le type dit qu'il y a deux cas possibles
fn diviser(a: i32, b: i32) -> Option<i32> {
if b == 0 { None } else { Some(a / b) }
}
match diviser(10, 0) {
Some(v) => println!("résultat : {v}"),
None => println!("division par zéro"),
}
En Rust, le compilateur vérifie l'exhaustivité : oublier un cas est une
erreur de compilation. Rendre les états incorrects impossibles à écrire.
Nuance : Python 3.10 offre la même
syntaxe (match/case) mais aucune vérification
d'exhaustivité : un match incomplet ne déclenche rien. La syntaxe est empruntée,
la garantie ne l'est pas.