Uso de uniones literales como Enums
Parte de la sección Introducción a Luau del Journey de Lua de Coddy. Lección 58 de 80.
Las uniones de literales demuestran su utilidad como parámetros de función. Asigna la unión al tipo de un parámetro y el verificador garantiza que la función solo se llame con un miembro válido:
type Direction = "up" | "down" | "left" | "right"
local function move(direction: Direction)
print(`Moving {direction}...`)
end
move("left") -- ✓
move("north") -- ✗ error de tipo: no es un DirectionDentro de la función, maneja todos los miembros de forma exhaustiva con una cadena if/elseif. Como el tipo limita la entrada a cuatro valores, comprobar tres y dejar que else abarque el último cubre todos los casos:
local function describe(direction: Direction): string
if direction == "up" then
return "Going upward"
elseif direction == "down" then
return "Going downward"
elseif direction == "left" then
return "Turning left"
else
return "Turning right"
end
endHay una salvedad: las cadenas que llegan desde fuera, como io.read(), se tipan como string común, porque el verificador no puede saber qué escribirá el usuario. El operador de conversión de tipo de Luau, ::, lo resuelve: value :: Type indica al verificador que trate el valor como ese tipo. La lección sobre aserciones de tipo, cerca del final de esta sección, explica las conversiones en detalle; por ahora, basta con una línea:
local direction = io.read() :: DirectionUna conversión de tipo es una promesa, no una comprobación: en tiempo de ejecución no se verifica la entrada. En código de producción, primero se validaría; aquí permite que las funciones tipadas acepten la entrada del usuario sin complicaciones.
Desafío
FácilConvierte una dirección escrita por el jugador en una acción.
- Escribe
type Direction = "up" | "down" | "left" | "right". - Escribe
local function getAction(direction: Direction): stringpara que devuelva"Climb","Drop","Turn left"o"Turn right". - Lee
local direction = io.read() :: Directione imprimegetAction(direction).
Pulsa Ejecutar código: con la entrada up, la salida muestra Climb.
Pruébalo tú mismo
-- 1) tipo Direction
-- 2) getAction(direction: Direction): string
-- 3) local direction = io.read() :: Direction, luego imprime la acción
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