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

Enums & pattern matching, ou les sum types Enums & pattern matching, or sum types

Modéliser l'une de ces formes, exclusivement — et l'exhaustivité que match impose : le compilateur refuse d'oublier un cas. L'état invalide devient irreprésentable. Model one of these shapes, exclusively — and the exhaustiveness match enforces: the compiler refuses to forget a case. The invalid state becomes unrepresentable.

AudienceAudience
Dev ayant assimilé possession et lifetimes (Vols 1–2) Dev who has absorbed ownership and lifetimes (Vols 1–2)
Format
Self-paced
ChapitresChapters
5
Date
Juin 2026 Jun 2026
≈ 18 min ●●○○ TypesEnumsmatch

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'une de ces formes, exclusivement » — inscrit dans le type.'One of these shapes, exclusively' — written into the type.

Les Vols 1 et 2 portaient sur la mémoire : qui possède, qui emprunte, pour combien de temps. Le Vol 3 change de registre — il porte sur les types, et sur une idée qui retourne la manière de concevoir un programme : au lieu de détecter les états invalides à l'exécution, on les rend impossibles à écrire. Le premier outil pour ça est l'enum : non pas une liste de constantes comme ailleurs, mais un type qui dit « une valeur est exactement l'une de ces formes ».Vols 1 and 2 were about memory: who owns, who borrows, for how long. Vol 3 shifts register — it's about types, and an idea that flips how you design a program: instead of detecting invalid states at runtime, you make them impossible to write. The first tool for it is the enum: not a list of constants as elsewhere, but a type that says 'a value is exactly one of these shapes'.

Un sum type — chaque variante a sa propre chargeA sum type — each variant carries its own payload
enum Paiement {
    Carte { numero: String, exp: String },   // chaque forme porte
    Virement { iban: String },                // SES propres données
    Especes,                                  // ou aucune
}

// une valeur Paiement est EXACTEMENT l'une des trois — jamais deux,
// jamais zéro, jamais un mélange. L'exclusivité est dans le type.
Sum type vs product typeSum type vs product type

Une struct est un produit : elle a un champ A et un champ B et un champ C — toutes les combinaisons existent. Un enum est une somme : la variante A ou B ou C — une seule à la fois. Là où le produit multiplie les états possibles, la somme les restreint à ceux qu'on a explicitement listés. C'est cette restriction qui fait disparaître l'invalide.A struct is a product: it has field A and field B and field C — all combinations exist. An enum is a sum: variant A or B or C — only one at a time. Where the product multiplies possible states, the sum restricts them to those you explicitly listed. That restriction is what makes the invalid disappear.

Le réflexe du numéroThe issue's reflex

« Ces cas sont-ils mutuellement exclusifs ? » Si oui — un paiement est par carte ou par virement, jamais les deux — alors c'est un enum, pas une struct à champs optionnels. On modélise l'exclusivité dans le type, et le compilateur la fait respecter pour toi.'Are these cases mutually exclusive?' If yes — a payment is by card or by transfer, never both — then it's an enum, not a struct with optional fields. You model the exclusivity in the type, and the compiler enforces it for you.

Pas le enum que tu connais.Not the enum you know.

En C, Java ou TypeScript, un enum est une liste de noms — au fond, des entiers déguisés. L'enum de Rust est un type algébrique : chaque variante peut porter des données différentes, structurées. Carte transporte deux String, Virement un seul, Especes rien. C'est une union étiquetée, vérifiée par le compilateur — bien plus proche du « discriminated union » de TypeScript que de son enum.In C, Java or TypeScript, an enum is a list of names — at bottom, disguised integers. Rust's enum is an algebraic type: each variant can carry different, structured data. Carte carries two Strings, Virement one, Especes none. It's a tagged union, compiler-checked — far closer to TypeScript's 'discriminated union' than to its enum.

🔒

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