¿Qué es un Closure?
Parte de la sección Logic & Flow del Journey de Lua de Coddy — lección 14 de 54.
Has aprendido que las funciones pueden almacenarse en variables, pasarse como argumentos y devolverse desde otras funciones. Ahora exploraremos una de las consecuencias más poderosas de esto: las clausuras (closures).
Un cierre (closure) ocurre cuando una función anidada "recuerda" las variables locales de su función contenedora, incluso después de que esa función externa haya terminado de ejecutarse. Esto puede sonar extraño al principio: ¿cómo puede seguir existiendo una variable después de que la función que la creó haya terminado?
Aquí tienes un ejemplo sencillo que demuestra este concepto:
function createCounter()
local count = 0
return function()
count = count + 1
return count
end
end
local counter = createCounter()
print(counter()) -- Resultado: 1
print(counter()) -- Resultado: 2
print(counter()) -- Resultado: 3Cuando se llama a createCounter(), crea una variable local count y devuelve una función anónima. Normalmente, esperarías que count desapareciera una vez que createCounter() termine. Pero la función devuelta todavía tiene acceso a count; "hace un cierre" sobre esa variable.
Cada vez que llamas a counter(), accede y modifica la misma variable count que se creó cuando createCounter() se ejecutó por primera vez. La función interna lleva su entorno consigo, preservando el estado entre llamadas.
Desafío
FácilEscribe una función createMultiplier que cree una función multiplicadora con un factor específico y luego la use inmediatamente para multiplicar un número dado.
Lógica:
- Crea una función anidada dentro de
createMultiplierque tome un parámetro numérico - La función anidada debe multiplicar su parámetro por el
factorde la función externa - La función anidada formará un cierre (closure), recordando el valor de
factor - Llama a la función multiplicadora con el parámetro
numbery devuelve el resultado
Parámetros:
factor(número): El valor del multiplicadornumber(número): El número a multiplicar
Devuelve:
- El resultado de multiplicar
numberporfactor(número)
Hoja de referencia
Un closure ocurre cuando una función anidada "recuerda" las variables locales de su función contenedora, incluso después de que la función externa haya terminado de ejecutarse.
La función interna lleva su entorno consigo, preservando el estado entre llamadas:
function createCounter()
local count = 0
return function()
count = count + 1
return count
end
end
local counter = createCounter()
print(counter()) -- Salida: 1
print(counter()) -- Salida: 2
print(counter()) -- Salida: 3Cuando se llama a createCounter(), crea una variable local count y devuelve una función anónima. La función devuelta todavía tiene acceso a count—"se cierra sobre" esa variable, incluso después de que la función externa termine de ejecutarse.
Pruébalo tú mismo
function createMultiplier(factor, number)
local multiply = function(x)
return x * factor
end
-- Usa la función multiply a continuación
endEsta 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