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 DirectionAll’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
endUn 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() :: DirectionUn 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.
Sfida
FacileCrea 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:
- chiama
movecon la direzione - stampa il risultato di
getMovementDescriptionper 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
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Introduzione a Luau
1Per iniziare con Luau
Che cos'è Luau?Perché usare Luau?Il tuo primo codice LuauVerifica dei tipi e modalità di erroreRiepilogo: introduzione a Luau4Lavorare con le funzioni
Tipizzare i parametri e i valori restituitiTipizzare le funzioni anonimeFunzioni che non restituiscono nullaParametri opzionaliValori predefiniti dei parametriFunzioni variadicheDefinire i tipi di funzioneRiepilogo: funzioni tipizzate2Tipi fondamentali
Tipi di base: num, str, boolIl tipo 'any': una via di fugaIl tipo 'unknown'Nil e tipi opzionaliL'inferenza dei tipi in azioneAnnotazioni esplicite dei tipiRipasso: esercizi sui tipi fondamentali5Alias, unioni e intersezioni
Alias di tipo per i primitiviTipi unioneLavorare con i tipi unioneTipi letteraliTipi intersezioneCombinare gli alias di tipoRiepilogo: combinazioni avanzate di tipi8Gli enum, secondo lo stile di Luau
Il pattern degli enum in LuauEnum numerici con le tabelleEnum di stringhe come unioniUsare enum con unioni di valori letteraliCongelare le tabelle costantiRiepilogo: gli enum, secondo lo stile di Luau3Tabelle tipizzate: array e mappe
Array tipizzatiAggiungere e leggere elementiChe cos'è un tipo Map?Dichiarare e accedere alle mappeIterare sulle tabelleTabelle con strutture misteArray tipizzati multidimensionalitable.unpack e argomenti variabiliRiepilogo: array e mappeEsercitati da solo: Compilatore Luau online