Congelación de tablas constantes
Parte de la sección Introducción a Luau del Journey de Lua de Coddy. Lección 59 de 80.
Una tabla de constantes tiene un punto débil: sigue siendo una tabla común. 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 convierte una tabla en de solo lectura durante la ejecución: cualquier intento de añadir, cambiar o eliminar un campo genera un error. La forma habitual de hacerlo es congelar la tabla justo cuando se crea: 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, esta es una protección durante la ejecución: un error real en el momento en que se ejecuta la escritura, no una advertencia durante la edición. También protege contra código que el comprobador de tipos nunca vio.
Vale la pena conocer dos funciones complementarias: table.isfrozen(t) devuelve si una tabla está congelada, y el congelamiento 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 más una unión literal para los parámetros conforman la enumeración completa de Luau: valores con nombre durante la ejecución que nadie puede manipular, y comprobación durante la edición en todos los lugares donde se usan.
Desafío
FácilCrea una tabla constante que nada pueda cambiar.
- Crea
local Size = table.freeze({Small = 1, Medium = 2, Large = 3}). - Imprime
Size.Largeytable.isfrozen(Size). - Guarda
pcall(function() Size.Huge = 4 end)enlocal oke imprimeok.
Pulsa Run Code: la salida muestra 3, true y false.
Pruébalo tú mismo
-- 1) local Size = table.freeze({...})
-- 2) imprime Size.Large y table.isfrozen(Size)
-- 3) guarda en ok lo que devuelve pcall para la escritura prohibida e imprímelo
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 Luau4Trabajar con funciones
Tipado de parámetros y valores de retornoTipado de funciones anónimasFunciones que no devuelven nadaParámetros opcionalesValores predeterminados de parámetrosValores predeterminados para booleanosFunciones variádicasDefinir tipos de funcionesRepaso: funciones tipadas7Proyecto: Gestor de tareas tipado
Proyecto: La estructura de una tareaFunción para añadir una tarea2Tipos fundamentales
Número, cadena y booleanoEl tipo 'any': una salida de emergenciaEl tipo 'unknown'Tipos nulos y opcionalesLa inferencia de tipos en acciónAnotaciones de tipo explícitasRepaso: práctica de tipos fundamentales5Alias, 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 mapas
Arrays tipadosAgregar y leer elementos¿Qué es un tipo mapa?Declarar y acceder a mapasRecorrer tablasTablas de formas mixtasLeer una cuadrículaConstruir una cuadrículatable.unpackRepaso: arrays y mapasPractica por tu cuenta: Compilador de Luau online