Funciones variádicas (...)
Parte de la sección Logic & Flow del Journey de Lua de Coddy — lección 11 de 54.
A veces necesitas una función que pueda trabajar con cualquier número de argumentos. Tal vez quieras calcular la suma de dos números, o tres, o 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, se convierte en una función variádica que acepta cualquier número de argumentos:
function sum(...)
-- Cuerpo de la función
endDentro de la función, puedes acceder a estos argumentos usando ... de nuevo. 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)) -- Resultado: 30
print(sum(1, 2, 3, 4, 5)) -- Resultado: 15La expresión {...} crea una tabla de estilo lista que contiene todos los argumentos pasados a la función. Luego puedes iterar a través de esta tabla como cualquier otra, usando el operador de longitud # o ipairs().
Desafío
FácilEscribe una función calculateAverage que acepte cualquier cantidad de argumentos numéricos y devuelva su promedio.
Usa la sintaxis variádica ... para aceptar un número flexible de argumentos, empaquetarlos en una tabla, calcular su suma y dividirla por la cantidad total.
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), lo que expande los valores de la tabla como argumentos individuales — por lo que tu función los recibe como .... No necesitas modificar ni entender este código en detalle; solo concéntrate en escribir calculateAverage.
Lógica:
- Empaqueta todos los argumentos en una tabla usando
{...} - Itera a través de la tabla para calcular la suma de todos los números
- Divide la suma por el número de argumentos para obtener el promedio
- Devuelve el promedio como un número
Parámetros:
...(numbers): Cantidad variable de argumentos numéricos
Devuelve: El promedio de todos los números proporcionados (number)
Hoja de referencia
Lua admite funciones variádicas que pueden aceptar cualquier número de argumentos utilizando la sintaxis de tres puntos ...:
function sum(...)
-- Cuerpo de la función
endDentro de una función variádica, empaqueta los argumentos en una tabla usando {...}:
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: 15La expresión {...} crea una tabla que contiene todos los argumentos. Puedes iterar a través de ella usando el operador de longitud # o ipairs().
Pruébalo tú mismo
-- No toques 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
local average = calculateAverage(unpack(numbers))
print("Average: " .. average)
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Logic & Flow
1Iteración avanzada de tablas
Iterar con pairs()Iterar con ipairs()pairs() vs. ipairs()Resumen - Ficha de personaje2Más funciones de la librería table
table.concat()Construcción de tablas y unpack()table.sort()Ordenamiento personalizado con funcionesRepaso - Tabla de puntuaciones altas3Conceptos avanzados de funciones
Retorno de múltiples valoresFunciones variádicas (...)Funciones como valores de primera claseFunciones anónimas¿Qué es un Closure?Resumen - Manejador de eventos simple