Énumérations
Une énumération décrit un ensemble fermé de valeurs nommées : priorité d'un ticket, état d'un dossier ou résultat d'une vérification. Elle évite de représenter ces choix par du texte libre.
Déclarer et utiliser un choix métier
module examples.priorities
enum Priority
normal
watch
urgent
function Classify
takes overdue_days as Int
gives Priority
do
if overdue_days >= 7
give Priority.urgent
else if overdue_days >= 3
give Priority.watch
else
give Priority.normal
Priority.urgent est une valeur de Priority, pas de Text. Une autre
énumération peut déclarer un membre urgent sans devenir interchangeable :
l'identité du type compte, pas seulement le nom du membre.
Aux frontières du programme
Dans un argument ou résultat JSON typé, ce membre se représente par
"urgent". Le runtime vérifie cette valeur contre l'énumération attendue.
"critical" n'est pas accepté si ce membre n'a pas été déclaré. Une réponse
de handler ou de provider reste soumise à ce contrôle.
Les comparaisons == et != portent sur des valeurs du même type enum.
Les types enum peuvent être importés et utilisés dans des records, listes et
optionnels.
Bien choisir le type
- Utilisez une enum pour un vocabulaire fermé relu avec le programme.
- Utilisez
Textpour du contenu libre, par exemple le message du ticket. - Utilisez
Optional of Prioritysi la priorité peut réellement être absente, plutôt qu'un membre artificiel qui mélangerait absence et décision métier.
text(Priority.urgent) renvoie "urgent", le nom canonique du membre.
La conversion fonctionne aussi pour une enum importée ; elle ne convertit pas
une liste ou un optionnel. Déballez explicitement un optionnel avant conversion.
Pour un libellé traduit, utilisez une fonction pure qui associe chaque membre
au texte métier souhaité.
Sélection exhaustive
match choisit une branche d'après la valeur nominale. Tous les membres
sont obligatoires, une fois chacun. Ajouter un membre à l'enum fait donc
signaler les sélections à compléter, y compris dans les modules consommateurs.
module examples.labels
enum Priority
normal
urgent
function Label
takes priority as Priority
gives Text
do
match priority
case Priority.normal
give "Normal"
case Priority.urgent
give "Urgent"
La valeur est évaluée une seule fois. Une seule branche s'exécute ; ses
bindings restent locaux. Les appels, pauses humaines et limites conservent
leurs contrôles habituels. Il n'y a ni cas par défaut ni conversion de texte
en enum implicite. Pour des conditions numériques ou ouvertes, utilisez if.