Congelando Tables Constantes
Parte da seção Introdução ao Luau do Journey de Lua da Coddy — lição 55 de 73.
Uma tabela constante tem uma fraqueza: ela ainda é uma tabela comum. Qualquer código, em qualquer lugar, pode escrever UserRole.Admin = 99 — e suas "constantes" silenciosamente deixam de ser constantes.
O Luau fecha essa lacuna 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 idioma é congelar a tabela logo onde ela é construída — 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 leituraDiferente de tudo o mais neste curso até agora, esta é uma proteção em tempo de execução — um erro real no momento em que a escrita é executada, e não um aviso em tempo de edição. Isso protege até mesmo contra códigos que o checador de tipos nunca viu.
Dois companheiros que vale a pena conhecer: table.isfrozen(t) retorna se uma tabela está congelada, e o congelamento é raso — tabelas aninhadas permanecem mutáveis, a menos que você também as congele. Você também não pode descongelar: uma vez congelada, a tabela permanece congelada.
Uma tabela constante congelada somada a uma união de literais para parâmetros é o enum completo do Luau: valores nomeados em tempo de execução que ninguém pode adulterar, e verificação em tempo de edição em todos os lugares onde são usados.
Desafio
FácilCrie uma tabela constante congelada chamada Color — construa e congele em um único passo com table.freeze — contendo:
Red=1Green=2Blue=3
Crie uma tabela simples (não congelada) chamada settings com um campo volume = 5.
Imprima, cada um em sua própria linha:
Color.RedColor.Blue- se
Colorestá congelada (table.isfrozen) - se
settingsestá congelada - o resultado de tentar adicionar um campo a
Colordentro depcall— chamepcall(function() Color.Gold = 4 end)e imprima o boolean 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 imprima o booleano retornado
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 Tipos8Enums, do Jeito Luau
O Padrão Enum no LuauEnums Numéricos com TablesEnums de String como UnionsUsando Enums de Union LiteralCongelando Tables ConstantesRecapitulação: Enums, do Jeito Luau3Tabelas 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 Maps