Menu
CoddyTech

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 silenciosamente

Declare 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 User

Se 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.

challenge icon

Desafio

Fácil

Transforme uma tabela sem tipo definido em uma tabela com uma estrutura declarada.

  1. Acima da tabela, escreva type Pet = {name: string, age: number}.
  2. Anote o tipo da tabela: local pet: Pet = {name = "Biscuit", age = 3}.
  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

Pratique por conta própria: Compilador de Luau online