Menu
CoddyTech

Formas frente a tablas no estructuradas

Parte de la sección Introducción a Luau del Journey de Lua de Coddy. Lección 42 de 80.

Ahora tienes dos formas de trabajar con tablas de registros: la forma flexible que siempre has usado en Lua y las formas declaradas. Vale la pena detenerse un momento para ver qué ventajas ofrece cada una.

Una tabla flexible acepta cualquier cosa. Esa flexibilidad tiene un precio: si escribes mal un campo (user.nmae), obtienes nil sin darte cuenta; si olvidas un campo, el error aparece mucho más adelante, durante la ejecución, en el código que primero acceda a ese campo faltante:

local user = {name = "Ana", age = 20}
print(user.nmae) -- tabla sin restricciones: imprime nil sin avisar

Declara una forma y esos errores pasan de producirse durante la ejecución a detectarse al editar. El comprobador señala el error tipográfico en cuanto lo escribes, tu editor puede autocompletar los nombres de los campos y la declaración type también sirve como documentación de lo que contiene la tabla:

type User = {name: string, age: number}
local user: User = {name = "Ana", age = 20}
print(user.nmae) -- ✗ error de tipo: no se encontró la clave 'nmae' en User

Si vienes de TypeScript, ten en cuenta que Luau no tiene la palabra clave interface: type sirve para todas las formas. Tampoco existe la «fusión de declaraciones»: declarar dos tipos con el mismo nombre en el mismo ámbito es un error, así que cada forma tiene exactamente una definición.

Las formas de Luau son estructurales: cualquier tabla con los campos correctos y los tipos adecuados coincide, sin importar dónde ni cómo se haya creado. Y las tablas flexibles siguen teniendo su lugar: los scripts rápidos y los datos realmente dinámicos no necesitan una forma declarada. Sin embargo, para cualquier dato que se pase entre funciones, una forma detecta los errores cuando todavía es barato corregirlos.

challenge icon

Desafío

Fácil

Convierte una tabla sin tipo declarado en una tabla con una forma declarada.

  1. Encima de la tabla, escribe type Pet = {name: string, age: number}.
  2. Anota la tabla: local pet: Pet = {name = "Biscuit", age = 3}.
  3. Debajo del primer print, añade print(pet.age).

Presiona Ejecutar código: la salida muestra Biscuit y 3.

Pruébalo tú mismo

-- Una tabla flexible: nada verifica sus campos
local pet = {name = "Biscuit", age = 3}
print(pet.name)

Todas las lecciones de Introducción a Luau

Practica por tu cuenta: Compilador de Luau online