Menu
Coddy logo textTech

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 Direction

Dentro 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
end

Un 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() :: Direction

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

challenge icon

Desafío

Fácil

Crea 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:

  1. llama a move con la dirección
  2. imprime el resultado de getMovementDescription para 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
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