Menu
Coddy logo textTech

Congelando Tables Constantes

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

Uma tabela de constantes tem uma fraqueza: 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 em tempo de execução: qualquer tentativa de adicionar, alterar ou remover um campo gera um erro. O padrão é congelar a tabela exatamente no momento em 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 normalmente
Color.Gold = 4   -- ✗ erro: tentativa de modificar uma tabela somente leitura

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

Dois recursos complementares que vale a pena conhecer: 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. Você também não pode descongelar: depois de congelada, uma tabela permanece congelada.

Uma tabela de constantes congelada, junto com uma união literal para parâmetros, forma o enum completo do Luau: valores nomeados em tempo de execução que ninguém pode alterar e verificação em tempo de edição em todos os lugares onde são usados.

challenge icon

Desafio

Fácil

Crie uma tabela constante congelada chamada Color, construa-a e congele-a em uma única etapa com table.freeze, contendo:

  • Red = 1
  • Green = 2
  • Blue = 3

Crie uma tabela simples (não congelada) chamada settings com um campo volume = 5.

Imprima, cada um em sua própria linha:

  1. Color.Red
  2. Color.Blue
  3. se Color está congelada (table.isfrozen)
  4. se settings está congelada
  5. o resultado de tentar adicionar um campo a Color dentro de pcall: chame pcall(function() Color.Gold = 4 end) e imprima o booleano que ele retorna

Experimente você mesmo

-- Escreva o código aqui
-- 1) local Color = table.freeze({Red = 1, Green = 2, Blue = 3})
-- 2) local settings = {volume = 5}
-- 3) print Color.Red, Color.Blue, ambos os resultados de isfrozen
-- 4) pcall a escrita proibida e print o booleano retornado
quiz iconTeste seus conhecimentos

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

Pratique por conta própria: Compilador de Lua online