Menu
CoddyTech

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 Direction

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

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

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

challenge icon

Desafío

Fácil

Convierte una dirección escrita por el jugador en una acción.

  1. Escribe type Direction = "up" | "down" | "left" | "right".
  2. Escribe local function getAction(direction: Direction): string para que devuelva "Climb", "Drop", "Turn left" o "Turn right".
  3. Lee local direction = io.read() :: Direction e imprime getAction(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

Practica por tu cuenta: Compilador de Luau online