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 literales resultan especialmente útiles como parámetros de función. Escribe un parámetro con la unión y el comprobador 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") -- ✗ type error: not a Direction

Dentro de la función, maneja los miembros de forma exhaustiva con una cadena de if/elseif. Como el tipo limita la entrada a cuatro valores, comprobar tres y dejar que else tome 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
end

Hay un detalle: las cadenas que llegan desde fuera, como io.read(), se tipan como string simple, porque el comprobador no puede saber qué escribirá un usuario. La conversión con :: que aprendiste antes le indica 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 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 acepte direction: Direction e imprima Moving [direction]...

Crea una función getMovementDescription que acepte direction: Direction, devuelva un string y gestione 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 conviértela al tipo 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

Practica por tu cuenta: Compilador de Lua online