Funciones variádicas (...)
Parte de la sección Lógica y flujo de control 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. 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, se convierte en una función variádica que acepta cualquier cantidad de argumentos:
function sum(...)
-- Cuerpo de la función
endDentro de la función, puedes acceder a estos argumentos usando ... nuevamente. 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: 15La 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().
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 una cantidad flexible de argumentos, empaquetarlos en una tabla, calcular su suma y dividirla por la cantidad.
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, de modo que tu función los recibe como .... No necesitas modificar ni comprender este código en detalle; concéntrate únicamente en escribir calculateAverage.
Lógica:
- Empaqueta todos los argumentos en una tabla usando
{...} - Recorre la tabla para calcular la suma de todos los números
- Divide la suma por 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 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 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 Lógica y flujo de control
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 simplePractica por tu cuenta: Compilador de Lua online