Utiliser des Enums d'unions littérales
Fait partie de la section Introduction à Luau du Journey Lua de Coddy. Leçon 54 sur 73.
Les unions littérales révèlent toute leur utilité comme paramètres de fonction. Annote un paramètre avec l’union et le vérificateur garantit que la fonction ne sera appelée qu’avec un membre valide :
type Direction = "up" | "down" | "left" | "right"
local function move(direction: Direction)
print(`Moving {direction}...`)
end
move("left") -- ✓
move("north") -- ✗ type error: not a DirectionÀ l’intérieur de la fonction, traite les membres de manière exhaustive avec une chaîne if/elseif. Puisque le type limite l’entrée à quatre valeurs, il suffit d’en vérifier trois et de laisser else prendre en charge la dernière pour tout couvrir :
local function describe(direction: Direction): string
if direction == "up" then
return "Going upward"
elseif direction == "down" then
return "Going downward"
elseif direction == "left" then
return "Turning left"
else
return "Turning right"
end
endUne difficulté subsiste : les chaînes provenant de l’extérieur, comme io.read(), sont typées comme de simples string, car le vérificateur ne peut pas savoir ce que l’utilisateur va saisir. La conversion :: que tu as découverte plus tôt lui indique de traiter la valeur comme ton type d’énumération :
local direction = io.read() :: DirectionUne conversion est une promesse, pas une vérification : lors de l’exécution, rien ne vérifie l’entrée. Dans du code de production, tu commencerais par la valider ; ici, cela permet aux fonctions typées d’accepter proprement les entrées de l’utilisateur.
Défi
FacileCrée le type d’union littérale Direction avec les membres "up", "down", "left" et "right".
Crée une fonction move qui prend direction: Direction et affiche Moving [direction]...
Crée une fonction getMovementDescription qui prend direction: Direction, renvoie une string et gère chaque membre avec if/elseif/else :
"up"→Going upward"down"→Going downward"left"→Turning left"right"→Turning right
Lis une ligne auprès de l’utilisateur avec io.read() et convertis-la en Direction avec ::. Ensuite :
- appelle
moveavec la direction - affiche le résultat de
getMovementDescriptionpour la même direction
Essayez vous-même
-- Écrivez le code ici
-- 1) définir le type Direction
-- 2) écrire move et getMovementDescription (if/elseif/else)
-- 3) lire l'entrée : local direction = io.read() :: Direction
-- 4) appeler move, puis afficher la description
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Introduction à Luau
1Premiers pas avec Luau
Qu'est-ce que Luau ?Pourquoi utiliser Luau ?Votre premier code LuauVérification de type et modes d'erreurRécapitulatif : Introduction à Luau4Travailler avec les fonctions
Typage des paramètres et valeurs de retourTypage des fonctions anonymesFonctions ne retournant rienParamètres optionnelsValeurs par défaut des paramètresFonctions variadiquesDéfinition des types de fonctionsRécapitulatif : Fonctions typées2Types fondamentaux
Types de base : num, str, boolLe type 'any' : la porte de sortieLe type 'unknown'Types Nil et optionnelsL'inférence de type en actionAnnotations explicites de typeRécapitulatif : Pratique des types fondamentaux5Alias, unions et intersections
Alias de types pour les types primitifsTypes unionsTravailler avec les types unionsTypes littérauxTypes intersectionsCombinaison d'alias de typesRécapitulatif : Combinaisons de types avancées8Les Enums, à la manière de Luau
Le pattern Enum dans LuauEnums numériques avec des tablesEnums de chaînes comme unionsUtiliser des Enums d'unions littéralesGeler les tables de constantesRécapitulatif : Les Enums, à la manière de Luau3Tables typées : Tableaux et Maps
Tableaux typésAjout et lecture d'élémentsQu'est-ce qu'un type Map ?Déclaration et accès aux MapsItération sur les tablesTables à formes mixtesTableaux typés multidimensionnelstable.unpack et VarargsRécapitulatif : Tableaux et MapsEntraînez-vous par vous-même : Compilateur Lua en ligne