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 leituraAo 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.
Desafio
FácilCrie uma tabela constante congelada chamada Color, construa-a e congele-a em uma única etapa 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 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
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 MapsPratique por conta própria: Compilador de Lua online