Upvalue condivisi tra closure
Comprenda la condivisione dello stesso upvalue tra più closure e le implicazioni delle modifiche.
Upvalue condivisi tra closure è una lezione Lua Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Lua Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Lua Academy include 4 lezioni in totale.
Condivisione dello stesso upvalue
Due closure definite nello stesso ambito possono condividere la stessa identica cella di upvalue. Le modifiche apportate da una sono visibili all’altra.
local function makeGetterSetter()
local value = 0
local function get() return value end
local function set(v) value = v end
return get, set
end
local get, set = makeGetterSetter()
set(42)
print(get()) -- 42Perché avviene la condivisione
Lua non copia gli upvalue per ogni closure. Tutte le closure create nello stesso blocco che puntano alla stessa variabile locale condividono un’unica cella di upvalue.
Observer pattern tramite un upvalue condiviso
Un upvalue condiviso può fungere da bus di messaggi tra più closure.
local count = 0
local inc = function() count = count + 1 end
local dec = function() count = count - 1 end
local get = function() return count end
inc(); inc(); dec()
print(get()) -- 1Insidia della variabile nei loop
In un loop numeric for, ogni iterazione crea una nuova variabile locale del loop; perciò le closure catturano upvalue indipendenti.
local fns = {}
for i = 1, 3 do
fns[i] = function() return i end
end
print(fns[1](), fns[2](), fns[3]()) -- 1 2 3 (each closure has its own i)Insidia della variabile nei loop while
In un loop while, se si cattura una singola variabile che cambia, tutte le closure condividono lo stesso upvalue e vedono il valore finale.
local fns = {}
local i = 0
while i < 3 do
i = i + 1
fns[i] = function() return i end -- all share same i!
end
print(fns[1]()) -- 3 (not 1!)Catturare una nuova variabile locale
Per catturare valori indipendenti in un loop while, introduca una nuova variabile locale all’interno del corpo del loop.
local fns = {}
local i = 0
while i < 3 do
i = i + 1
local ci = i -- new local per iteration
fns[i] = function() return ci end
end
print(fns[1]()) -- 1, fns[2]() == 2Pattern del modulo con stato condiviso
Un modulo può esporre più funzioni che condividono una tabella di stato privata tramite gli upvalue.
local function makeStack()
local data = {}
return {
push = function(v) data[#data+1] = v end,
pop = function() local v = data[#data]; data[#data]=nil; return v end,
size = function() return #data end,
}
endAlias e modifica
Faccia attenzione: tutte le closure che fanno riferimento allo stesso upvalue vedono immediatamente la stessa modifica. È una caratteristica potente, ma può causare un accoppiamento indesiderato.
Identità dell’upvalue
debug.upvalueid(f, n) restituisce l’identità univoca dell’n-esimo upvalue della funzione f. Due closure con lo stesso ID di upvalue condividono la stessa cella.
debug.upvaluejoin
debug.upvaluejoin(f1, n1, f2, n2) fa sì che l’n-esimo upvalue di f1 condivida la stessa cella del n2-esimo upvalue di f2. È uno strumento di basso livello per il debug.
Pattern pratici
- Coppie getter/setter che condividono una variabile privata.
- Contatore di eventi con reset esposto tramite più closure.
- Stato del modulo condiviso tra diverse funzioni dell’API.
Domanda sugli upvalue condivisi
Le due closure get e set vengono create nello stesso ambito ed entrambe catturano value. Se si chiama set(99), che cosa restituisce get()?
Riepilogo: upvalue condivisi
Le closure nello stesso ambito condividono le celle degli upvalue. Le modifiche sono immediatamente visibili a tutte le closure che le condividono. Questo è il fondamento dell’incapsulamento e dello stato dei moduli in Lua.
Domande Frequenti
La lezione «Upvalue condivisi tra closure» è gratuita?
Sì — il testo completo di «Upvalue condivisi tra closure» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Lua Academy, passa a CoddyKit PRO. Il corso Lua Academy include 4 lezioni in totale.
Cosa imparerò in «Upvalue condivisi tra closure»?
Comprenda la condivisione dello stesso upvalue tra più closure e le implicazioni delle modifiche. Eserciti Lua Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Lua Academy?
Non è richiesta alcuna esperienza precedente. Lua Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Upvalue condivisi tra closure»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Lua Academy?
Sì. Ogni lezione Lua Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Cosa sono gli upvalue?
- Upvalue condivisi tra closure
- Funzioni factory e generatori
- Memoization con le closure