Menu
Coddy logo textTech

Che cos'è una closure?

Fa parte della sezione Logica e flusso del percorso Lua di Coddy. Lezione 14 di 54.

Hai imparato che le funzioni possono essere memorizzate nelle variabili, passate come argomenti e restituite da altre funzioni. Ora esploreremo una delle conseguenze più potenti di tutto questo: le closure.

Una chiusura si verifica quando una funzione annidata «ricorda» le variabili locali della funzione che la racchiude, anche dopo che quella funzione esterna ha terminato l’esecuzione. All’inizio potrebbe sembrare strano: come può esistere ancora una variabile dopo che la funzione che l’ha creata ha terminato?

Ecco un semplice esempio che dimostra questo concetto:

function createCounter()
    local count = 0
    
    return function()
        count = count + 1
        return count
    end
end

local counter = createCounter()
print(counter())  -- Output: 1
print(counter())  -- Output: 2
print(counter())  -- Output: 3

Quando viene chiamata createCounter(), crea una variabile locale count e restituisce una funzione anonima. Normalmente, ti aspetteresti che count scompaia una volta terminata l'esecuzione di createCounter(). Ma la funzione restituita ha ancora accesso a count. «Chiude» su quella variabile.

Ogni volta che chiami counter(), accede alla stessa variabile count e la modifica: quella creata quando createCounter() è stata eseguita per la prima volta. La funzione interna porta con sé il proprio ambiente, preservando lo stato tra una chiamata e l’altra.

challenge icon

Sfida

Facile

Scrivi una funzione createMultiplier che crea una funzione moltiplicatrice con un fattore specifico, poi la usa immediatamente per moltiplicare un numero dato.

Logica:

  • Crea una funzione annidata all'interno di createMultiplier che accetta un parametro numerico
  • La funzione annidata deve moltiplicare il suo parametro per il factor della funzione esterna
  • La funzione annidata formerà una closure, ricordando il valore di factor
  • Chiama la funzione moltiplicatrice con il parametro number e restituisci il risultato

Parametri:

  • factor (numero): il valore del moltiplicatore
  • number (numero): il numero da moltiplicare

Restituisce:

  • Il risultato della moltiplicazione di number per factor (numero)

Provalo tu

function createMultiplier(factor, number)
    local multiply = function(x)
        return x * factor
    end
    
    -- Usa la funzione multiply qui sotto

end
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Logica e flusso

Esercitati da solo: Compilatore Lua online