Definición y llamada de funciones
Aprenda la sintaxis para declarar funciones, las convenciones de llamada y la diferencia entre funciones locales y globales.
Definición y llamada de funciones es una lección gratuita de Lua Academy en CoddyKit. Esta es la lección 1 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.
Sintaxis de las funciones
Las funciones en Lua se definen con la palabra clave function. El cuerpo es un bloque terminado por end. Las funciones pueden ser globales o locales. Para llamar a una función, añada paréntesis con los argumentos. Si omite argumentos, los parámetros que falten reciben nil.
function sayHello(name)
print("Hello, " .. (name or "World") .. "!")
end
sayHello("Lua") -- Hello, Lua!
sayHello() -- Hello, World!
local function add(a, b)
return a + b
end
print(add(3, 4)) -- 7Valores devueltos
Las funciones devuelven valores mediante return. A diferencia de la mayoría de los lenguajes, las funciones de Lua pueden devolver varios valores. Si no utiliza return explícitamente, la función no devuelve nada (cero valores). Los valores devueltos sobrantes se descartan cuando la llamada no es la última expresión de una lista.
local function minMax(t)
local lo, hi = t[1], t[1]
for i = 2, #t do
if t[i] < lo then lo = t[i] end
if t[i] > hi then hi = t[i] end
end
return lo, hi
end
local lo, hi = minMax({5,2,8,1,9})
print(lo, hi) -- 1 9La función como valor
En Lua, las funciones son valores de primera clase. Puede almacenarlas en variables, pasarlas como argumentos a otras funciones y devolverlas. Esto permite implementar callbacks, funciones de orden superior y patrones de programación funcional.
local ops = {
add = function(a, b) return a + b end,
sub = function(a, b) return a - b end,
mul = function(a, b) return a * b end,
}
local function apply(op, a, b)
return op(a, b)
end
print(apply(ops.add, 10, 3)) -- 13
print(apply(ops.mul, 4, 5)) -- 20Funciones locales frente a globales
Utilice local function para las funciones auxiliares privadas de un módulo. Las funciones globales contaminan el espacio de nombres global y son accesibles desde cualquier lugar, lo que puede provocar conflictos de nombres. En la mayoría de los casos, prefiera funciones locales y exponga únicamente lo necesario mediante una tabla de módulo.
-- Bad: pollutes global namespace
function helper() end
-- Good: module-local
local function helper()
return "I am local"
end
-- Module export pattern
local M = {}
function M.publicFunc()
return helper() -- can call local
end
return MMétodos con sintaxis de dos puntos
Lua proporciona azúcar sintáctico para definir y llamar métodos en tablas. obj:method(arg) equivale a obj.method(obj, arg). La forma con dos puntos pasa implícitamente la tabla como primer argumento, que por convención se denomina self.
local Dog = {}
Dog.__index = Dog
function Dog.new(name)
return setmetatable({name=name}, Dog)
end
function Dog:speak()
print(self.name .. " says: Woof!")
end
local d = Dog.new("Rex")
d:speak() -- Rex says: Woof!Patrón de parámetros opcionales
Lua no tiene parámetros opcionales integrados, pero puede simularlos comprobando nil. Pase una única tabla de opciones a las funciones con muchos parámetros opcionales; es más claro que utilizar una lista larga de argumentos.
local function createUser(name, opts)
opts = opts or {}
return {
name = name,
role = opts.role or "user",
active = opts.active ~= false,
score = opts.score or 0,
}
end
local u = createUser("Alice", {role="admin", score=100})
print(u.name, u.role, u.score)Llamadas en cola
Una llamada en cola es una llamada a función que se encuentra en la posición final (la última acción antes de devolver el resultado). Lua realiza optimización de llamadas en cola: una llamada en cola correcta no utiliza espacio adicional en la pila. Esto permite una recursión profunda sin desbordamiento de pila cuando la llamada recursiva está en la posición final.
local function factorial(n, acc)
acc = acc or 1
if n <= 1 then return acc end
return factorial(n - 1, n * acc) -- tail call!
end
print(factorial(10)) -- 3628800
-- Can handle very large n without stack overflowFunciones invocadas inmediatamente
Puede definir y llamar una función inmediatamente: (function() ... end)(). Esto resulta útil para crear un ámbito local, ejecutar código de configuración exactamente una vez o evitar contaminar el ámbito externo con variables temporales.
local result = (function()
local temp = 100
local adjusted = temp * 1.5
return math.floor(adjusted)
end)()
print(result) -- 150
-- temp and adjusted not visible hereAlmacenar funciones en tablas
Almacenar funciones en tablas es una forma idiomática de diseñar módulos de Lua. La tabla actúa como un espacio de nombres. Puede definir funciones asignándolas a campos de la tabla o utilizando la notación de punto o de dos puntos con el nombre de la tabla.
local math2 = {}
function math2.clamp(val, lo, hi)
return math.max(lo, math.min(hi, val))
end
function math2.lerp(a, b, t)
return a + (b - a) * t
end
print(math2.clamp(150, 0, 100)) -- 100
print(math2.lerp(0, 10, 0.5)) -- 5.0Cierres como callbacks
Las funciones de orden superior aceptan callbacks. En Lua, los callbacks son simplemente valores de tipo función. Los cierres resultan especialmente útiles como callbacks porque capturan el contexto de la llamada sin necesidad de pasar argumentos adicionales a través de la función de orden superior.
local function forEach(t, fn)
for i, v in ipairs(t) do
fn(v, i)
end
end
local sum = 0
forEach({10, 20, 30}, function(v)
sum = sum + v
end)
print(sum) -- 60
forEach({"a","b","c"}, function(v, i)
print(i, v)
end)Comprobación rápida
¿Cuál es la salida de: local function f() return 1, 2, 3 end; local a, b = f()?
Repaso: funciones
Puntos clave:
- Use
local functionpara evitar contaminar los globales - Las funciones son ciudadanos de primera clase: puede almacenarlas en variables y tablas, y pasarlas como argumentos
- La sintaxis con dos puntos pasa
selfimplícitamente - Simule parámetros opcionales con
opts or {} - Las llamadas en cola evitan el desbordamiento de pila en recursiones profundas
- Las funciones invocadas inmediatamente crean ámbitos aislados
Preguntas frecuentes
¿La lección «Definición y llamada de funciones» es gratis?
Sí — el texto completo de «Definición y llamada de funciones» 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 «Definición y llamada de funciones»?
Aprenda la sintaxis para declarar funciones, las convenciones de llamada y la diferencia entre funciones locales y globales. 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 1 de 4.
¿Cuánto tiempo toma la lección «Definición y llamada de funciones»?
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