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 DirectionDentro 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
endUm 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() :: DirectionUm 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.
Desafio
FácilCrie 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:
- chame
movecom a direção - exiba o resultado de
getMovementDescriptionpara 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
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
1Começando com o Luau
O que é Luau?Por que usar Luau?Seu primeiro código em LuauVerificação de tipos e modos de erroRecapitulando: Introdução ao Luau4Trabalhando com Funções
Tipando Parâmetros e Valores de RetornoTipando Funções AnônimasFunções que Não Retornam NadaParâmetros OpcionaisValores Padrão para ParâmetrosFunções VariádicasDefinindo Tipos de FunçõesRecapitulação: Funções Tipadas2Tipos Fundamentais
Tipos Básicos: num, str, boolO Tipo 'any': Escape HatchO Tipo 'unknown'Tipos Nil e OpcionaisInferência de Tipos na PráticaAnotações Explícitas de TiposReciclagem: Prática de Tipos Fundamentais5Aliases, Uniões, Interseções
Aliases de Tipos para PrimitivosTipos de UniãoTrabalhando com Tipos de UniãoTipos LiteraisTipos de InterseçãoCombinando Aliases de TiposRecapitulando: Combinações Avançadas de Tipos8Enums, do Jeito Luau
O Padrão Enum no LuauEnums Numéricos com TablesEnums de String como UnionsUsando Enums de Union LiteralCongelando Tables ConstantesRecapitulação: Enums, do Jeito Luau3Tabelas Tipadas: Arrays e Maps
Arrays TipadosAdicionando e Lendo ElementosO que é um Tipo Map?Declarando e Acessando MapsIterando Sobre TabelasTabelas de Formato MistoArrays Tipados Multidimensionaistable.unpack e VarargsRecapitulando: Arrays e Maps