Uso de uniones literales como Enums
Parte de la sección Introducción a Luau del Journey de Lua de Coddy — lección 54 de 73.
Las uniones de literales demuestran su valor como parámetros de funciones. Tipo un parámetro con la unión y el comprobador garantiza que la función solo sea llamada 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 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 tome el último lo cubre todo:
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
endUn detalle: las cadenas que llegan desde el exterior —como io.read()— tienen el tipo simple string, porque el comprobador no puede saber qué escribirá un usuario. La conversión :: que aprendiste anteriormente le dice que trate el valor como tu tipo enumerado:
local direction = io.read() :: DirectionUna conversión es una promesa, no una comprobación; en tiempo de ejecución nada verifica la entrada. El código de producción se validaría primero; aquí permite que las funciones tipadas acepten la entrada del usuario de forma limpia.
Desafío
FácilCrea el tipo de unión literal Direction con los miembros "up", "down", "left" y "right".
Crea una función move que tome direction: Direction e imprima Moving [direction]...
Crea una función getMovementDescription que tome direction: Direction, devuelva un string y maneje cada miembro con if/elseif/else:
"up"→Going upward"down"→Going downward"left"→Turning left"right"→Turning right
Lee una línea del usuario con io.read() y realiza un cast a Direction con ::. Después:
- llama a
movecon la dirección - imprime el resultado de
getMovementDescriptionpara la misma dirección
Pruébalo tú mismo
-- Escribe código aquí
-- 1) define el tipo Direction
-- 2) escribe move y getMovementDescription (if/elseif/else)
-- 3) lee la entrada: local direction = io.read() :: Direction
-- 4) llama a move, luego imprime la descripción
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
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 Luau4Trabajando con Funciones
Tipado de Parámetros y Valores de RetornoTipado de Funciones AnónimasFunciones que no Retornan NadaParámetros OpcionalesValores por Defecto en ParámetrosFunciones VariádicasDefinición de Tipos de FuncionesRecapitulaciones: Funciones Tipadas2Tipos principales
Tipos básicos: num, str, boolEl tipo 'any': Vía de escapeEl tipo 'unknown'Tipos nulos y opcionalesInferencia de tipos en acciónAnotaciones explícitas de tiposResumen: Práctica de tipos principales5Alias, 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 Maps
Arrays tipadosAñadir y leer elementos¿Qué es un tipo Map?Declarar y acceder a MapsIterar tablasTablas de forma mixtaArrays tipados multidimensionalestable.unpack y VarargsRecapitulaciones: Arrays y Maps