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: 3Quando 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.
Sfida
FacileScrivi 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
createMultiplierche accetta un parametro numerico - La funzione annidata deve moltiplicare il suo parametro per il
factordella funzione esterna - La funzione annidata formerà una closure, ricordando il valore di
factor - Chiama la funzione moltiplicatrice con il parametro
numbere restituisci il risultato
Parametri:
factor(numero): il valore del moltiplicatorenumber(numero): il numero da moltiplicare
Restituisce:
- Il risultato della moltiplicazione di
numberperfactor(numero)
Provalo tu
function createMultiplier(factor, number)
local multiply = function(x)
return x * factor
end
-- Usa la funzione multiply qui sotto
endQuesta lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Logica e flusso
1Iterazione avanzata delle tabelle
Iterare con pairs()Iterare con ipairs()pairs() vs. ipairs()Riepilogo - Scheda del personaggio2Altre funzioni della libreria table
table.concat()Costruzione di tabelle e unpack()table.sort()Ordinamento personalizzato con funzioniRiepilogo - Tabellone dei punteggi più alti3Concetti avanzati sulle funzioni
Restituire più valoriFunzioni variadiche (...)Funzioni come valori di prima classeFunzioni anonimeChe cos'è una closure?Riepilogo - Gestore di eventi sempliceEsercitati da solo: Compilatore Lua online