Usando Enums de Union Literal
Parte da seção Introdução ao Luau do Journey de Lua da Coddy. Lição 58 de 80.
Uniões de literais mostram seu valor como parâmetros de função. Tipar um parâmetro com a união garante que o verificador só permitirá chamadas da função 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, trate os membros de forma exaustiva com uma cadeia de if/elseif. Como o tipo limita a entrada a quatro valores, verificar três e deixar o último para else cobre todas as possibilidades:
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á um detalhe: strings que vêm de fora, como io.read(), são tipadas como string simples, porque o verificador não pode saber o que o usuário vai digitar. O operador de conversão de tipo do Luau, ::, resolve isso: value :: Type diz ao verificador para tratar o valor como sendo desse tipo. A lição sobre asserções de tipo, perto do fim desta seção, aborda conversões em detalhes; por enquanto, uma linha basta:
local direction = io.read() :: DirectionUma conversão de tipo é uma promessa, não uma verificação: em tempo de execução, nada valida a entrada. Em código de produção, primeiro seria feita uma validação; aqui, isso permite que funções tipadas aceitem entradas do usuário sem complicações.
Desafio
FácilTransforme uma direção digitada pelo jogador em uma ação.
- Escreva
type Direction = "up" | "down" | "left" | "right". - Escreva
local function getAction(direction: Direction): stringretornando"Climb","Drop","Turn left"ou"Turn right". - Leia
local direction = io.read() :: Directione imprimagetAction(direction).
Pressione Executar código: com a entrada up, a saída mostra Climb.
Experimente você mesmo
-- 1) tipo Direction
-- 2) getAction(direction: Direction): string
-- 3) local direction = io.read() :: Direction, depois imprima a ação
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
Tipagem de parâmetros e valores de retornoTipagem de funções anônimasFunções sem retornoParâmetros opcionaisValores padrão dos parâmetrosValores padrão para booleanosFunções variádicasDefinindo tipos de funçãoRecapitulação: funções tipadas2Tipos básicos
Número, string e booleanoO tipo 'any': válvula de escapeO tipo 'unknown'Tipos nulos e opcionaisInferência de tipos na práticaAnotações explícitas de tipoRevisão: prática com tipos básicos5Aliases, 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 MapsPercorrendo TabelasTabelas com Formatos MistosLendo uma GradeConstruindo uma Gradetable.unpackRevisão: Arrays e MapsPratique por conta própria: Compilador de Luau online