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 de constantes tiene una debilidad: sigue siendo una tabla ordinaria. Cualquier código, en cualquier lugar, puede escribir UserRole.Admin = 99, y tus «constantes» dejan silenciosamente de ser constantes.
Luau cierra esa brecha con table.freeze. Congelar hace que una tabla sea de solo lectura durante la ejecución: cualquier intento de añadir, cambiar o eliminar un campo genera un error. La forma habitual es congelar la tabla justo donde se construye: table.freeze devuelve la misma tabla, lista para asignarla:
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 visto hasta ahora en este curso, esto es protección en tiempo de ejecución: un error real en el momento en que se ejecuta la escritura, no una advertencia durante la edición. Protege incluso contra código que el comprobador de tipos nunca vio.
Conviene conocer dos funciones relacionadas: table.isfrozen(t) devuelve si una tabla está congelada, y el congelado es superficial: las tablas anidadas siguen siendo mutables a menos que también las congeles. Tampoco puedes descongelar una tabla: una vez congelada, permanece congelada.
Una tabla de constantes congelada junto con una unión literal para los parámetros constituye el enum completo de Luau: valores con nombre en tiempo de ejecución que nadie puede alterar, y comprobación durante la 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 simple (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 añadir un campo a
Colordentro depcall: llama apcall(function() Color.Gold = 4 end)e imprime el 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 MapsPractica por tu cuenta: Compilador de Lua online