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 MapsPratique por conta própria: Compilador de Lua online