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 principalmente como parâmetros de função. Tipar um parâmetro com a união garante 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") -- ✗ type error: not a 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 deles e deixar else assumir o último cobre todos os casos:

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á uma ressalva: strings que chegam de fora, como io.read(), são tipadas como uma simples string, porque o verificador não pode saber o que o usuário vai digitar. O cast :: que você aprendeu anteriormente diz a ele para tratar o valor como seu tipo enum:

local direction = io.read() :: Direction

Um cast é uma promessa, não uma verificação; em tempo de execução, nada verifica a entrada. Em código de produção, você faria a validação primeiro; aqui, ele permite que funções tipadas aceitem a entrada do usuário de forma simples.

challenge icon

Desafio

Fácil

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

Crie uma função move que recebe direction: Direction e imprime 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 a conversão para Direction com ::. Em seguida:

  1. chame move com a direção
  2. imprima 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