Menu
Coddy logo textTech

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 lectura

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

challenge icon

Desafío

Fácil

Crea una tabla constante congelada llamada Color, constrúyela y congélala en un solo paso con table.freeze, que contenga:

  • Red = 1
  • Green = 2
  • Blue = 3

Crea una tabla simple (no congelada) llamada settings con un campo volume = 5.

Imprime, cada uno en su propia línea:

  1. Color.Red
  2. Color.Blue
  3. si Color está congelada (table.isfrozen)
  4. si settings está congelada
  5. el resultado de intentar añadir un campo a Color dentro de pcall: llama a pcall(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
quiz iconPonte a prueba

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

Practica por tu cuenta: Compilador de Lua online