L'absence n'est plus un piège caché. C'est un cas dans le type.Absence is no longer a hidden trap. It's a case in the type.
Le numéro précédent s'est clos sur le « bug à un milliard de dollars » : le null, cette valeur qui prétend être de n'importe quel type sans en être aucun. Rust ne l'a jamais introduit. À la place, un simple enum à deux variantes — Some(T) ou None — qui transforme « cette donnée pourrait être absente » d'une note dans ta tête en une contrainte que le compilateur fait respecter. C'est l'enum du numéro précédent, appliqué au problème le plus universel de la programmation.The previous issue closed on the 'billion-dollar mistake': null, that value pretending to be of any type while being none. Rust never introduced it. In its place, a plain two-variant enum — Some(T) or None — turning 'this data might be absent' from a note in your head into a constraint the compiler enforces. It's the previous issue's enum, applied to the most universal problem in programming.
enum Option<T> { // dans la bibliothèque standard, rien de magique : Some(T), // il y a une valeur, la voici None, // il n'y en a pas } // un type qui PEUT être absent le dit dans sa signature : fn trouver(id: u32) -> Option<Utilisateur> { /* ... */ } // ^^^^^^^^^^^^^^^^^^^^ « peut-être un User, peut-être rien »
Avec le null, toute référence peut secrètement être nulle — le type Utilisateur ment, il signifie en réalité « Utilisateur, ou bien rien, on verra à l'exécution ». Avec Option, le type dit la vérité : Utilisateur est toujours un utilisateur, et Option<Utilisateur> est le seul à pouvoir être absent. L'absence n'est plus partout par défaut : elle est exactement là où le type l'écrit, et nulle part ailleurs.With null, any reference can secretly be null — the type Utilisateur lies, it actually means 'Utilisateur, or else nothing, we'll see at runtime'. With Option, the type tells the truth: Utilisateur is always a user, and only Option<Utilisateur> can be absent. Absence is no longer everywhere by default: it's exactly where the type writes it, and nowhere else.
« Cette valeur peut-elle légitimement ne pas exister ? » Si oui — un utilisateur introuvable, un champ facultatif, le premier élément d'une liste peut-être vide — alors son type est Option<T>. Et dès lors, le compilateur t'interdit de lire la valeur sans avoir d'abord traité le cas où elle manque.'Can this value legitimately not exist?' If yes — a user not found, an optional field, the first element of a maybe-empty list — then its type is Option<T>. And from then on, the compiler forbids you from reading the value without first handling the case where it's missing.
On pourrait croire qu'envelopper chaque valeur facultative dans un enum coûte de la mémoire ou des indirections. Pour les références et beaucoup de types, non : le compilateur sait qu'une référence n'est jamais l'adresse zéro, et code None par ce zéro. Option<&T> occupe exactement la taille d'un pointeur — l'« optimisation de niche ». La sécurité est ici gratuite, au sens littéral.You might think wrapping each optional value in an enum costs memory or indirection. For references and many types, no: the compiler knows a reference is never address zero, and encodes None as that zero. Option<&T> takes exactly the size of a pointer — the 'niche optimization'. Safety here is free, in the literal sense.