Un atelier Rust · Édition d'ApprentissageA Rust Workshop · Learning Edition

Option, ou l'absence de null Option, or the absence of null

Le milliard de dollars qu'on ne paie pas : l'absence devient un cas qu'on DOIT traiter. unwrap et expect ont un prix — on le nomme. The billion-dollar mistake you don't pay: absence becomes a case you MUST handle. unwrap and expect have a price — we name it.

AudienceAudience
Dev ayant vu enums & pattern matching (Vol 3 №1) Dev who has seen enums & pattern matching (Vol 3 №1)
Format
Self-paced
ChapitresChapters
5
Date
Juin 2026 Jun 2026
≈ 18 min ●●○○ TypesOptionnull

Chapitre 1 en accès libre — la suite (ch. 2 à 5) est réservée. Chapter 1 free to read — the rest (ch. 2–5) is members-only.

01CadrageFraming3 min

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.

Option n'est pas un mot-clé : c'est un enum ordinaireOption isn't a keyword: it's an ordinary enum
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 »
La différence radicale avec nullThe radical difference from null

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.

L'optimisation de niche — None ne coûte pas un octet de plusThe niche optimization — None costs not a byte more
&T 8 octets, jamais 08 bytes, never 0
0x7ffe_1a40une adresse réellea real address
Option<&T> 8 octets aussi8 bytes too
0x7ffe_1a40Some(&T) — l'adressethe address
0x0000_0000None — le 0 interdit, réutiliséthe forbidden 0, reused
Le réflexe du numéroThe issue's reflex

« 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.

Aucun coût caché.No hidden cost.

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.

🔒

La suite est réservée The rest is members-only

Le premier numéro est libre. Débloque tout The Rust Loop — tous les volumes, à vie — pour 5 €, paiement unique. The first issue is free. Unlock all of The Rust Loop — every volume, forever — for €5, one-time.

Retour au kiosqueBack to newsstand