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 DirectionDentro 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
endHá 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() :: DirectionUm 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.
Desafio
FácilCrie 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:
- chame
movecom a direção - imprima 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