Menu
Coddy logo textTech

Usare enum con unioni di valori letterali

Fa parte della sezione Introduzione a Luau del percorso Lua di Coddy. Lezione 54 di 73.

Le unioni di valori letterali sono particolarmente utili come parametri di funzione. Assegna a un parametro il tipo dell’unione e il type checker garantisce che la funzione venga chiamata solo con un membro valido:

type Direction = "up" | "down" | "left" | "right"

local function move(direction: Direction)
    print(`Moving {direction}...`)
end

move("left")  -- ✓
move("north") -- ✗ errore di tipo: non è una Direction

All’interno della funzione, gestisci tutti i membri in modo esaustivo con una catena if/elseif. Poiché il tipo limita l’input a quattro valori, controllarne tre e lasciare che else gestisca l’ultimo copre tutti i casi:

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

Un dettaglio da tenere presente: le stringhe che arrivano dall’esterno, come io.read(), sono tipizzate come semplici string, perché il type checker non può sapere cosa digiterà l’utente. Il cast :: che hai imparato prima gli dice di trattare il valore come il tuo tipo enum:

local direction = io.read() :: Direction

Un cast è una promessa, non un controllo: in fase di esecuzione non viene verificato nulla sull’input. Nel codice di produzione, prima si convaliderebbe l’input; qui, invece, permette alle funzioni tipizzate di accettare facilmente l’input dell’utente.

challenge icon

Sfida

Facile

Crea il tipo di unione letterale Direction con i membri "up", "down", "left" e "right".

Crea una funzione move che accetta direction: Direction e stampa Moving [direction]...

Crea una funzione getMovementDescription che accetta direction: Direction, restituisce una string e gestisce ogni membro con if/elseif/else:

  • "up" → Going upward
  • "down" → Going downward
  • "left" → Turning left
  • "right" → Turning right

Leggi una riga dall'utente con io.read() e convertila nel tipo Direction con ::. Poi:

  1. chiama move con la direzione
  2. stampa il risultato di getMovementDescription per la stessa direzione

Provalo tu

-- Scrivi il codice qui
-- 1) definisci il tipo Direction
-- 2) scrivi move e getMovementDescription (if/elseif/else)
-- 3) leggi l'input: local direction = io.read() :: Direction
-- 4) chiama move, poi stampa la descrizione
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Introduzione a Luau

Esercitati da solo: Compilatore Luau online