Menu
CoddyTech

Funciones variádicas (...)

Parte de la sección Lógica y flujo del Journey de Lua de Coddy. Lección 11 de 54.

A veces necesitas una función que pueda trabajar con cualquier cantidad de argumentos. Quizá quieras calcular la suma de dos números, o de tres, o de diez, sin escribir funciones separadas para cada caso. Lua proporciona una sintaxis especial para esto: los tres puntos ...

Cuando colocas ... en la lista de parámetros de una función, esta se convierte en una función variádica que acepta cualquier número de argumentos:

function sum(...)
    -- Cuerpo de la función
end

Dentro de la función, puedes acceder a estos argumentos usando ... otra vez. Para trabajar con ellos más fácilmente, puedes empaquetarlos en una tabla usando llaves:

function sum(...)
    local args = {...}
    local total = 0
    for i = 1, #args do
        total = total + args[i]
    end
    return total
end

print(sum(5, 10, 15))  -- Salida: 30
print(sum(1, 2, 3, 4, 5))  -- Salida: 15

La expresión {...} crea una tabla de estilo lista que contiene todos los argumentos pasados a la función. Después puedes iterar por esta tabla como por cualquier otra, usando el operador de longitud # o ipairs().

Esto funciona siempre que ningún argumento sea nil. Un nil deja un hueco en la tabla, y # no es fiable en una tabla con huecos. select("#", ...) siempre devuelve el número de argumentos, incluidos los que son nil:

function countArgs(...)
    return select("#", ...)
end

print(countArgs(10, 20, 30))        -- Salida: 3
print(countArgs(10, nil, 30, nil))  -- Salida: 4
challenge icon

Desafío

Fácil

Escribe una función calculateAverage que acepte cualquier cantidad de argumentos numéricos y devuelva su promedio.

Usa la sintaxis variádica ... para aceptar una cantidad flexible de argumentos, agrúpalos en una tabla, calcula su suma y divídela por la cantidad de argumentos.

Nota: El código inicial (marcado como "Don't touch this code") lee números de la entrada, convierte cada uno de texto a número usando tonumber() y los almacena en una tabla llamada numbers. Al final, llama a tu función usando unpack(numbers), que distribuye los valores de la tabla como argumentos individuales, por lo que tu función los recibe como .... No necesitas modificar ni comprender este código en detalle; solo concéntrate en escribir calculateAverage.

Lógica:

  • Agrupa todos los argumentos en una tabla usando {...}
  • Recorre la tabla para calcular la suma de todos los números
  • Divide la suma entre la cantidad de argumentos para obtener el promedio
  • Devuelve el promedio como un número

Parámetros:

  • ... (números): cantidad variable de argumentos numéricos

Devuelve: El promedio de todos los números proporcionados (número)

Pruébalo tú mismo

-- No modifiques este código --
local numbers = {}
while true do
    local input = io.read()
    if input == nil or input == "" then
        break
    end
    local num = tonumber(input)
    if num then
        table.insert(numbers, num)
    end
end
-------------------------

function calculateAverage(...)
    -- Escribe el código aquí
end
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 Lógica y flujo

Practica por tu cuenta: Compilador de Lua online