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
endDentro 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: 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().
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: 4Desafí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, 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
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
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