Menu
CoddyTech

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 lectura

A 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.

challenge icon

Desafío

Fácil

Crea una tabla constante que nada pueda cambiar.

  1. Crea local Size = table.freeze({Small = 1, Medium = 2, Large = 3}).
  2. Imprime Size.Large y table.isfrozen(Size).
  3. Guarda pcall(function() Size.Huge = 4 end) en local ok e imprime ok.

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

Practica por tu cuenta: Compilador de Luau online