¿Qué es un Closure?
Parte de la sección Lógica y flujo de control del Journey de Lua de Coddy. Lección 14 de 54.
Has aprendido que las funciones se pueden almacenar en variables, pasar como argumentos y devolver desde otras funciones. Ahora exploraremos una de las consecuencias más poderosas de esto: los cierres.
Un cierre ocurre cuando una función anidada «recuerda» las variables locales de su función envolvente, 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()) -- Salida: 1
print(counter()) -- Salida: 2
print(counter()) -- Salida: 3Cuando se llama a createCounter(), se crea una variable local count y se devuelve una función anónima. Normalmente, esperarías que count desapareciera una vez que createCounter() terminara. Pero la función devuelta todavía tiene acceso a count. Esa función «cierra sobre» esa variable.
Cada vez que llamas a counter(), accede a la misma variable count y la modifica, la cual se creó cuando createCounter() se ejecutó por primera vez. La función interna lleva consigo su entorno, 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 después la use inmediatamente para multiplicar un número dado.
Lógica:
- Crea una función anidada dentro de
createMultiplierque acepte un parámetro number - La función anidada debe multiplicar su parámetro por el
factorde la función externa - La función anidada formará un cierre, 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 multiplicadornumber(número): El número que se va a multiplicar
Devuelve:
- El resultado de multiplicar
numberporfactor(número)
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 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