Menu
Coddy logo textTech

Funciones Variádicas

Parte de la sección Introducción a Luau del Journey de Lua de Coddy — lección 27 de 73.

Has usado ... (varargs) de Lua para escribir funciones que aceptan cualquier cantidad de argumentos. Luau te permite tipar los varargs, de modo que cada argumento que entra es verificado:

function sum(...: number): number
    local total = 0
    for _, n in ipairs({...}) do
        total = total + n
    end
    return total
end

print(sum(1, 2))           -- 3
print(sum(1, 2, 3, 4, 5))  -- 15

...: number declara que cada argumento adicional debe ser un número — sum(1, "two") se convierte en un error de tipo. Las herramientas en tiempo de ejecución son las que ya conoces:

  • {...} reúne los varargs en un arreglo (aquí un {number})
  • select("#", ...) cuenta cuántos argumentos llegaron
  • ... se puede pasar directamente a otra función, por ejemplo, math.max(...)

Como en Lua, ... debe ser el último parámetro — los parámetros regulares (tipados) van primero, y la cola variádica recoge el resto:

function joinWords(separator: string, ...: string): string
    return table.concat({...}, separator)
end

print(joinWords("-", "a", "b", "c"))  -- a-b-c
challenge icon

Desafío

Fácil

Crea una función llamada sumAll que tome cualquier número de argumentos number (...: number) y devuelva su suma como un number.

Crea una función llamada countValues que tome cualquier número de argumentos string y devuelva cuántos fueron pasados, como un number — usa select("#", ...).

Crea una función llamada joinWords que tome un separator: string obligatorio seguido de cualquier número de argumentos string, y los devuelva unidos con el separador (usa table.concat en {...}) — tipo de retorno string.

Llama e imprime, cada uno en su propia línea:

  1. sumAll(5, 10, 15)
  2. sumAll(1, 2, 3, 4, 5)
  3. countValues("a", "b", "c", "d")
  4. joinWords("-", "apple", "banana", "cherry")
  5. joinWords(" | ", "red", "green", "blue")

Pruébalo tú mismo

-- Escribe código aquí
-- sumAll(...: number): number       -- itera sobre {...}
-- countValues(...: string): number  -- select("#", ...)
-- joinWords(separator: string, ...: string): string
-- luego imprime los cinco resultados
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