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 leituraDiferentemente 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.
Desafio
FácilCrie uma tabela constante que nada possa alterar.
- Crie
local Size = table.freeze({Small = 1, Medium = 2, Large = 3}). - Imprima
Size.Largeetable.isfrozen(Size). - Armazene
pcall(function() Size.Huge = 4 end)emlocal oke imprimaok.
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
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
Tipagem de parâmetros e valores de retornoTipagem de funções anônimasFunções sem retornoParâmetros opcionaisValores padrão dos parâmetrosValores padrão para booleanosFunções variádicasDefinindo tipos de funçãoRecapitulação: funções tipadas2Tipos básicos
Número, string e booleanoO tipo 'any': válvula de escapeO tipo 'unknown'Tipos nulos e opcionaisInferência de tipos na práticaAnotações explícitas de tipoRevisão: prática com tipos básicos5Aliases, 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 MapsPercorrendo TabelasTabelas com Formatos MistosLendo uma GradeConstruindo uma Gradetable.unpackRevisão: Arrays e MapsPratique por conta própria: Compilador de Luau online