Formatos vs. Tabelas Flexíveis
Parte da seção Introdução ao Luau do Journey de Lua da Coddy. Lição 42 de 80.
Agora você tem duas maneiras de trabalhar com tabelas de registros: o modo flexível que sempre usou em Lua e os formatos declarados. Vale a pena parar um momento para ver o que cada um oferece.
Uma tabela flexível aceita qualquer coisa. Essa flexibilidade tem um preço: se você escrever um campo errado (user.nmae), receberá nil silenciosamente; se esquecer um campo, o bug aparecerá muito longe, em tempo de execução, em qualquer código que acessar essa lacuna primeiro:
local user = {name = "Ana", age = 20}
print(user.nmae) -- tabela flexível: imprime nil silenciosamenteDeclare um formato e esses erros passam de tempo de execução para o momento da edição. O verificador sinaliza o erro de digitação assim que você o escreve, seu editor pode completar automaticamente os nomes dos campos, e a declaração type também serve como documentação do conteúdo da tabela:
type User = {name: string, age: number}
local user: User = {name = "Ana", age = 20}
print(user.nmae) -- ✗ erro de tipo: chave 'nmae' não encontrada em UserSe você vem do TypeScript, observe que Luau não tem a palavra-chave interface: type dá conta de todos os formatos. Também não há "mesclagem de declarações": declarar dois tipos com o mesmo nome no mesmo escopo é um erro, então cada formato tem exatamente uma definição.
Os formatos de Luau são estruturais: qualquer tabela com os campos certos dos tipos certos corresponde, independentemente de onde ou como foi criada. E as tabelas flexíveis ainda têm seu lugar: scripts rápidos e dados realmente dinâmicos não precisam de um formato declarado. Porém, para qualquer coisa passada entre funções, um formato detecta erros enquanto ainda é barato corrigi-los.
Desafio
FácilTransforme uma tabela sem tipo definido em uma tabela com uma estrutura declarada.
- Acima da tabela, escreva
type Pet = {name: string, age: number}. - Anote o tipo da tabela:
local pet: Pet = {name = "Biscuit", age = 3}. - Abaixo da primeira chamada de impressão, adicione
print(pet.age).
Pressione Executar código: a saída mostra Biscuit e 3.
Experimente você mesmo
-- Uma tabela sem restrições: nada verifica seus campos
local pet = {name = "Biscuit", age = 3}
print(pet.name)
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 Tipos3Tabelas 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 Maps6Tipando Formatos de Tabelas
Anotações de Formato InlineAliases de Tipo para FormatosPropriedades OpcionaisFormatos vs. Tabelas FlexíveisEstendendo FormatosAdicionando Métodos a FormatosSelf e Métodos com Dois PontosRecapitulação: Definindo Formatos de TabelasPratique por conta própria: Compilador de Luau online