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 avisarDeclara 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 UserSi 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.
Desafío
FácilConvierte una tabla sin tipo declarado en una tabla con una forma declarada.
- Encima de la tabla, escribe
type Pet = {name: string, age: number}. - Anota la tabla:
local pet: Pet = {name = "Biscuit", age = 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
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 tipos3Tablas 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 mapas6Definición de formas de tablas
Anotaciones de forma en líneaAlias de tipos para formasPropiedades opcionalesFormas frente a tablas no estructuradasExtensión de formasAñadir métodos a las formasEl parámetro 'self' y los métodos con dos puntosRecapitulación: Definición de formas de tablasPractica por tu cuenta: Compilador de Luau online