Propriedades Opcionais
Parte da seção Introdução ao Luau do Journey de Lua da Coddy. Lição 39 de 73.
Nem todo campo está sempre presente. Em Lua, um campo ausente de uma tabela simplesmente é lido como nil, o que é flexível, mas também é assim que bugs como attempt to concatenate a nil value aparecem.
O Luau permite que uma estrutura declare isso explicitamente: adicione ? depois do tipo de um campo para marcá-lo como opcional:
type User = {
name: string, -- obrigatório
email: string?, -- opcional: string ou nil
}
local alice: User = {name = "Alice", email = "alice@luau.dev"}
local bob: User = {name = "Bob"} -- ✓ tudo bem, email é opcionalVocê já viu isso antes com variáveis: string? é uma forma abreviada de string | nil. Agora, a mesma ideia se aplica a campos individuais de uma estrutura.
Como um campo opcional pode ser nil, você precisa verificá-lo antes de usá-lo. O padrão clássico de Lua funciona e, no modo estrito, o verificador restringe o tipo dentro do ramo:
if bob.email then
print(`email: {bob.email}`) -- aqui email é uma string
else
print("no email on file")
endOpcional significa “pode estar ausente”. Isso não significa “qualquer tipo”. Se email existir, ele ainda deverá ser uma string.
Desafio
FácilCrie um alias de tipo chamado User com:
namedo tipostring(obrigatório)emaildo tipostring?(opcional)
Crie dois usuários:
alice: nome"Alice", e-mail"alice@luau.dev"bob: nome"Bob", sem e-mail
Crie uma função printContact que recebe um User. Se o usuário tiver um e-mail, ela imprime [name] - [email]; caso contrário, imprime [name] - no email.
Em seguida:
- chame
printContact(alice) - chame
printContact(bob) - imprima o resultado da comparação
bob.email == nil
Experimente você mesmo
-- Escreva o código aqui
-- 1) defina o tipo User com um campo email opcional
-- 2) crie alice (com email) e bob (sem)
-- 3) escreva printContact com uma verificação de nil
-- 4) chame-a para ambos os usuários, depois imprima bob.email == nil
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 Tipos3Tabelas 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