Congelación de tablas constantes
Parte de la sección Introducción a Luau del Journey de Lua de Coddy — lección 55 de 73.
Una tabla constante tiene una debilidad: sigue siendo una tabla ordinaria. Cualquier código, en cualquier lugar, puede escribir UserRole.Admin = 99 y tus "constantes" dejarán de ser constantes silenciosamente.
Luau soluciona esto con table.freeze. Congelar hace que una tabla sea de solo lectura en tiempo de ejecución: cualquier intento de añadir, cambiar o eliminar un campo lanza un error. El modismo habitual es congelar la tabla justo donde se construye; table.freeze devuelve la misma tabla, lista para asignar:
local Color = table.freeze({
Red = 1,
Green = 2,
Blue = 3,
})
print(Color.Red) -- 1: la lectura funciona como de costumbre
Color.Gold = 4 -- ✗ error: intento de modificar una tabla de solo lecturaA diferencia de todo lo demás en este curso hasta ahora, esta es una protección en tiempo de ejecución: un error real en el momento en que se ejecuta la escritura, no una advertencia en tiempo de edición. Protege incluso contra el código que el comprobador de tipos nunca vio.
Dos funciones complementarias que vale la pena conocer: table.isfrozen(t) devuelve si una tabla está congelada, y el congelamiento es superficial: las tablas anidadas permanecen mutables a menos que también las congeles. Tampoco puedes descongelar: una vez congelada, una tabla permanece congelada.
Una tabla constante congelada más una unión de literales para parámetros es el enum completo de Luau: valores con nombre en tiempo de ejecución con los que nadie puede interferir, y comprobación en tiempo de edición en todos los lugares donde se usan.
Desafío
FácilCrea una tabla constante congelada llamada Color — constrúyela y congélala en un solo paso con table.freeze — que contenga:
Red=1Green=2Blue=3
Crea una tabla normal (no congelada) llamada settings con un campo volume = 5.
Imprime, cada uno en su propia línea:
Color.RedColor.Blue- si
Colorestá congelada (table.isfrozen) - si
settingsestá congelada - el resultado de intentar agregar un campo a
Colordentro depcall— llama apcall(function() Color.Gold = 4 end)e imprime el valor booleano que devuelve
Pruébalo tú mismo
-- Escribe código aquí
-- 1) local Color = table.freeze({Red = 1, Green = 2, Blue = 3})
-- 2) local settings = {volume = 5}
-- 3) print Color.Red, Color.Blue, ambos resultados de isfrozen
-- 4) pcall la escritura prohibida e imprime el booleano devuelto
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Introducción a Luau
1Primeros pasos con Luau
¿Qué es Luau?¿Por qué usar Luau?Tu primer código en LuauComprobación de tipos y modos de errorRecapitulacion: Introducción a Luau4Trabajando con Funciones
Tipado de Parámetros y Valores de RetornoTipado de Funciones AnónimasFunciones que no Retornan NadaParámetros OpcionalesValores por Defecto en ParámetrosFunciones VariádicasDefinición de Tipos de FuncionesRecapitulaciones: Funciones Tipadas2Tipos principales
Tipos básicos: num, str, boolEl tipo 'any': Vía de escapeEl tipo 'unknown'Tipos nulos y opcionalesInferencia de tipos en acciónAnotaciones explícitas de tiposResumen: Práctica de tipos principales5Alias, Uniones e Intersecciones
Alias de tipos para primitivosTipos de uniónTrabajando con tipos de uniónTipos literalesTipos de intersecciónCombinando alias de tiposResumen: Combinaciones avanzadas de tipos8Enums al estilo de Luau
El patrón Enum en LuauEnums numéricos con tablasEnums de cadena como unionesUso de uniones literales como EnumsCongelación de tablas constantesRecapitulación: Enums al estilo de Luau3Tablas tipadas: Arrays y Maps
Arrays tipadosAñadir y leer elementos¿Qué es un tipo Map?Declarar y acceder a MapsIterar tablasTablas de forma mixtaArrays tipados multidimensionalestable.unpack y VarargsRecapitulaciones: Arrays y Maps