Menu
CoddyTech

Congelando Tables Constantes

Parte da seção Introdução ao Luau do Journey de Lua da Coddy. Lição 59 de 80.

Uma tabela de constantes tem um ponto fraco: ela ainda é uma tabela comum. Qualquer código, em qualquer lugar, pode escrever UserRole.Admin = 99, e suas "constantes" deixam silenciosamente de ser constantes.

Luau elimina essa brecha com table.freeze. Congelar torna uma tabela somente leitura durante a execução: qualquer tentativa de adicionar, alterar ou remover um campo gera um erro. O padrão é congelar a tabela assim que ela é criada: table.freeze retorna a mesma tabela, pronta para ser atribuída:

local Color = table.freeze({
    Red = 1,
    Green = 2,
    Blue = 3,
})

print(Color.Red) -- 1: a leitura funciona como de costume
Color.Gold = 4   -- ✗ erro: tentativa de modificar uma tabela somente de leitura

Diferentemente de tudo o que vimos neste curso até agora, esta é uma proteção de tempo de execução: um erro real no momento em que a escrita é executada, não um aviso durante a edição. Ela protege até mesmo contra código que o verificador de tipos nunca analisou.

Vale conhecer dois recursos relacionados: table.isfrozen(t) retorna se uma tabela está congelada, e o congelamento é superficial: tabelas aninhadas continuam mutáveis, a menos que você também as congele. Além disso, não é possível descongelar: uma vez congelada, a tabela permanece congelada.

Uma tabela de constantes congelada junto com uma união literal para os parâmetros formam a enumeração completa em Luau: valores nomeados em tempo de execução que ninguém pode adulterar e verificação durante a edição em todos os lugares onde são usados.

challenge icon

Desafio

Fácil

Crie uma tabela constante que nada possa alterar.

  1. Crie local Size = table.freeze({Small = 1, Medium = 2, Large = 3}).
  2. Imprima Size.Large e table.isfrozen(Size).
  3. Armazene pcall(function() Size.Huge = 4 end) em local ok e imprima ok.

Pressione Executar código: a saída mostra 3, true e false.

Experimente você mesmo

-- 1) local Size = table.freeze({...})
-- 2) print Size.Large and table.isfrozen(Size)
-- 3) armazene em ok o que pcall retorna para a escrita proibida e imprima o resultado

Todas as lições de Introdução ao Luau

Pratique por conta própria: Compilador de Luau online