Menu
CoddyTech

Usare enum con unioni di valori letterali

Fa parte della sezione Introduzione a Luau del percorso Lua di Coddy. Lezione 58 di 80.

Le unioni di valori letterali si rivelano utili come parametri di funzione. Assegna a un parametro il tipo unione e il controllo dei tipi 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 è un Direction

All'interno della funzione, gestisci 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

Una particolarità: le stringhe provenienti dall'esterno, come io.read(), sono tipizzate come semplici string, perché il controllo dei tipi non può sapere cosa scriverà l'utente. L'operatore di conversione di tipo di Luau, ::, risolve il problema: value :: Type dice al controllo dei tipi di trattare il valore come quel tipo. La lezione sulle asserzioni di tipo, verso la fine di questa sezione, approfondisce le conversioni; per ora basta una riga:

local direction = io.read() :: Direction

Una conversione è una promessa, non un controllo: durante l'esecuzione non viene verificato alcun 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

Trasforma una direzione digitata dal giocatore in un'azione.

  1. Scrivi type Direction = "up" | "down" | "left" | "right".
  2. Scrivi local function getAction(direction: Direction): string che restituisca "Climb", "Drop", "Turn left" oppure "Turn right".
  3. Leggi local direction = io.read() :: Direction e stampa getAction(direction).

Premi Esegui il codice: con l'input up, l'output mostra Climb.

Provalo tu

-- 1) tipo Direction
-- 2) getAction(direction: Direction): string
-- 3) local direction = io.read() :: Direction, poi stampa l'azione

Tutte le lezioni di Introduzione a Luau

Esercitati da solo: Compilatore Luau online