Menu
CoddyTech

Usando Enums de Union Literal

Parte da seção Introdução ao Luau do Journey de Lua da Coddy. Lição 58 de 80.

Uniões de literais mostram seu valor como parâmetros de função. Tipar um parâmetro com a união garante que o verificador só permitirá chamadas da função com um membro válido:

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

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

move("left")  -- ✓
move("north") -- ✗ erro de tipo: não é um Direction

Dentro da função, trate os membros de forma exaustiva com uma cadeia de if/elseif. Como o tipo limita a entrada a quatro valores, verificar três e deixar o último para else cobre todas as possibilidades:

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

Há um detalhe: strings que vêm de fora, como io.read(), são tipadas como string simples, porque o verificador não pode saber o que o usuário vai digitar. O operador de conversão de tipo do Luau, ::, resolve isso: value :: Type diz ao verificador para tratar o valor como sendo desse tipo. A lição sobre asserções de tipo, perto do fim desta seção, aborda conversões em detalhes; por enquanto, uma linha basta:

local direction = io.read() :: Direction

Uma conversão de tipo é uma promessa, não uma verificação: em tempo de execução, nada valida a entrada. Em código de produção, primeiro seria feita uma validação; aqui, isso permite que funções tipadas aceitem entradas do usuário sem complicações.

challenge icon

Desafio

Fácil

Transforme uma direção digitada pelo jogador em uma ação.

  1. Escreva type Direction = "up" | "down" | "left" | "right".
  2. Escreva local function getAction(direction: Direction): string retornando "Climb", "Drop", "Turn left" ou "Turn right".
  3. Leia local direction = io.read() :: Direction e imprima getAction(direction).

Pressione Executar código: com a entrada up, a saída mostra Climb.

Experimente você mesmo

-- 1) tipo Direction
-- 2) getAction(direction: Direction): string
-- 3) local direction = io.read() :: Direction, depois imprima a ação

Todas as lições de Introdução ao Luau

Pratique por conta própria: Compilador de Luau online