Menu
Coddy logo textTech

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
end

Une 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() :: Direction

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

challenge icon

Défi

Facile

Cré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 :

  1. appelle move avec la direction
  2. affiche le résultat de getMovementDescription pour 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
quiz iconTestez-vous

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

Entraînez-vous par vous-même : Compilateur Lua en ligne