Menu
Coddy logo textTech

Usando Enums de Union Literal

Parte da seção Introdução ao Luau do Journey de Lua da Coddy — lição 54 de 73.

Uniões literais mostram seu valor como parâmetros de função. Tipar um parâmetro com a união faz o verificador garantir que a função só seja chamada 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, manipule os membros de forma austiva com uma cadeia de if/elseif. Como o tipo limita a entrada a quatro valores, verificar três e deixar o else para o último cobre tudo:

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

Um detalhe: strings vindas do lado de fora — como io.read() — são tipadas como string simples, porque o verificador não tem como saber o que o usuário vai digitar. O cast :: que você aprendeu anteriormente diz para tratar o valor como o seu tipo enum:

local direction = io.read() :: Direction

Um cast é uma promessa, não uma verificação — em tempo de execução nada valida a entrada. Códigos de produção validariam primeiro; aqui ele permite que funções tipadas aceitem a entrada do usuário de forma limpa.

challenge icon

Desafio

Fácil

Crie o tipo de união literal Direction com os membros "up", "down", "left" e "right".

Crie uma função move que recebe direction: Direction e exibe Moving [direction]...

Crie uma função getMovementDescription que recebe direction: Direction, retorna uma string, e trata cada membro com if/elseif/else:

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

Leia uma linha do usuário com io.read() e faça o cast para Direction com ::. Em seguida:

  1. chame move com a direção
  2. exiba o resultado de getMovementDescription para a mesma direção

Experimente você mesmo

-- Escreva o código aqui
-- 1) defina o tipo Direction
-- 2) escreva move e getMovementDescription (if/elseif/else)
-- 3) leia a entrada: local direction = io.read() :: Direction
-- 4) chame move, depois imprima a descrição
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

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