Varargs y el operador ...
Gestione listas de argumentos de longitud variable mediante ... y select().
Varargs y el operador ... es una lección gratuita de Lua Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Lua Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Lua Academy incluye 4 lecciones en total.
Argumentos variables
Una función de Lua puede aceptar un número variable de argumentos mediante ... (tres puntos) en la lista de parámetros. Dentro de la función, ... representa los argumentos adicionales. Puede usarlo en expresiones, pasarlo a otras funciones o convertirlo en una tabla.
local function sum(...)
local total = 0
for _, v in ipairs({...}) do
total = total + v
end
return total
end
print(sum(1, 2, 3)) -- 6
print(sum(10, 20, 30, 40)) -- 100select() para argumentos variables
select(n, ...) devuelve los argumentos desde la posición n en adelante. select("#", ...) devuelve el recuento total de argumentos, incluidos los valores nil. Es más seguro que #{...}, que se detiene en el primer hueco con nil.
local function inspect(...)
local n = select("#", ...)
print("count:", n)
for i = 1, n do
print(i, select(i, ...))
end
end
inspect("a", "b", nil, "d")
-- count: 4
-- 1 a
-- 2 b
-- 3 nil
-- 4 dPasar ... a otra función
Puede reenviar directamente los argumentos variables a otra función mediante f(...). Cuando ... aparece como el último argumento de una llamada, se pasan todos los argumentos variables. Esto resulta útil para envolver funciones o registrar información.
local function log(level, ...)
io.write("[" .. level .. "] ")
print(...)
end
log("INFO", "Server started on port", 8080)
log("ERROR", "File not found:", "config.lua")
-- [INFO] Server started on port 8080
-- [ERROR] File not found: config.luatable.pack y table.unpack
Convierta los argumentos variables en una tabla con table.pack(...), que también almacena el recuento en el campo n. Convierta una tabla de nuevo en argumentos variables con table.unpack(t, i, j). Juntas, estas funciones le proporcionan un control total sobre las listas de argumentos variables.
local function pack_and_show(...)
local packed = table.pack(...)
print("n =", packed.n)
for i = 1, packed.n do
print(i, packed[i])
end
end
pack_and_show(10, nil, 30)
-- n = 3
-- 1 10
-- 2 nil
-- 3 30Argumentos fijos y variables combinados
Una función puede tener parámetros fijos y variables. Los parámetros fijos aparecen primero; ... captura el resto. Los parámetros fijos se asignan antes de que el resto se incluya en ....
local function printf(fmt, ...)
io.write(string.format(fmt, ...))
end
printf("Hello, %s! You are %d years old.\n", "Alice", 30)
printf("Pi is approximately %.4f\n", math.pi)
local function firstAndRest(first, ...)
print("first:", first)
print("rest count:", select("#", ...))
end
firstAndRest(1, 2, 3, 4)Argumentos variables en un constructor de tablas
Puede expandir directamente los argumentos variables en un constructor de tablas: {...}. Cuando se usa como último elemento, se incluyen todos los argumentos. Sin embargo, los huecos con nil pueden confundir a #; prefiera table.pack cuando necesite recuentos exactos.
local function toArray(...)
return {...} -- collect all args as array
end
local arr = toArray("x", "y", "z")
for i, v in ipairs(arr) do
print(i, v)
end
-- 1 x
-- 2 y
-- 3 zExpresiones con argumentos variables
... puede aparecer en cualquier posición de una expresión. En una asignación múltiple, se expande a todos sus valores. En una expresión aritmética, solo se usa el primer valor. Comprender este comportamiento evita errores sutiles al combinar ... con otras expresiones.
local function first(...)
local x = ...
return x
end
print(first(10, 20, 30)) -- 10 (only first)
local function addFirst(n, ...)
local x = ...
return n + x
end
print(addFirst(5, 3, 99)) -- 8 (3 is first ...)print() usa argumentos variables
La función integrada print() de Lua también es una función con argumentos variables. Acepta cualquier cantidad de argumentos, convierte cada uno en una cadena y los separa con tabulaciones. Comprender esto le ayudará a escribir funciones de utilidad similares.
-- print is vararg
print(1, 2, 3) -- 1 2 3
print("a", nil, "b") -- a nil b
print() -- (empty line)
-- Reimplementing a simple print-like function
local function myprint(...)
local parts = {}
for i = 1, select("#", ...) do
parts[i] = tostring(select(i, ...))
end
io.write(table.concat(parts, "\t") .. "\n")
end
myprint(10, nil, 30)Reenviar argumentos con pcall
Combine pcall con argumentos variables para crear un envoltorio genérico de llamadas seguras. El envoltorio acepta una función y cualquier cantidad de argumentos, la llama mediante pcall y devuelve los resultados o un error.
local function safeCall(fn, ...)
local ok, result = pcall(fn, ...)
if ok then
return result
else
print("Error:", result)
return nil
end
end
local function divide(a, b)
assert(b ~= 0, "division by zero")
return a / b
end
print(safeCall(divide, 10, 2)) -- 5.0
print(safeCall(divide, 10, 0)) -- Error: ...Patrón para acumular argumentos variables
Un patrón habitual con argumentos variables consiste en iterar sobre todos los argumentos y acumular un resultado. Puede hacerlo con una tabla local o sumarlos directamente mediante select. Ambos enfoques son válidos; el de la tabla resulta más claro cuando hay muchos argumentos.
local function average(...)
local n = select("#", ...)
if n == 0 then return 0 end
local total = 0
for i = 1, n do
total = total + select(i, ...)
end
return total / n
end
print(average(10, 20, 30, 40)) -- 25.0
print(average(5)) -- 5.0Comprobación rápida
¿Qué devuelve select("#", 1, nil, 3)?
Repaso: argumentos variables
Resumen:
function f(...): acepta argumentos variablesselect("#", ...): obtiene un recuento seguro que incluye los valores nilselect(n, ...): obtiene los valores desde la posición ntable.pack(...): convierte los argumentos variables en una tabla con el recuento .ntable.unpack(t): convierte una tabla en argumentos variables...en la última posición se expande por completo; en una posición intermedia produce un valor
Preguntas frecuentes
¿La lección «Varargs y el operador ...» es gratis?
Sí — el texto completo de «Varargs y el operador ...» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Lua Academy, actualiza a CoddyKit PRO. El curso de Lua Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Varargs y el operador ...»?
Gestione listas de argumentos de longitud variable mediante ... y select(). Practicas Lua Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Lua Academy?
No se requiere experiencia previa. Lua Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Varargs y el operador ...»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Lua Academy?
Sí. Cada lección de Lua Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Definición y llamada de funciones
- Múltiples valores de retorno
- Varargs y el operador ...
- Recursión en Lua