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

Pratique por conta própria: Compilador de Lua online