Menu
Coddy logo textTech

¿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: 3

Cuando 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.

challenge icon

Desafío

Fácil

Escribe 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 createMultiplier que tome un parámetro numérico
  • La función anidada debe multiplicar su parámetro por el factor de 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 number y devuelve el resultado

Parámetros:

  • factor (número): El valor del multiplicador
  • number (número): El número a multiplicar

Devuelve:

  • El resultado de multiplicar number por factor (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: 3

Cuando 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

end
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Logic & Flow