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