Sulkeumien jakamat upvaluet
Tutkikaa useiden sulkeumien yhteistä upvaluea ja muuttamisen vaikutuksia.
Sulkeumien jakamat upvaluet on ilmainen Lua Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Lua Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Lua Academy-kurssilla on yhteensä 4 oppituntia.
Saman upvaluen jakaminen
Kaksi samassa näkyvyysalueessa määriteltyä sulkeumaa voi jakaa täsmälleen saman upvalue-solun. Toisen tekemät muutokset näkyvät toisessa.
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()) -- 42Miksi jakaminen tapahtuu
Lua ei kopioi upvalueja jokaista sulkeumaa varten. Kaikki samassa lohkossa luodut sulkeumat, jotka viittaavat samaan paikalliseen muuttujaan, jakavat yhden upvalue-solun.
Tarkkailijamalli jaettuja upvalueja käyttäen
Jaettu upvalue voi toimia viestinvälityskanavana useiden sulkeumien välillä.
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()) -- 1Silmukkamuuttujan sudenkuoppa
numeric for -silmukassa jokainen iteraatio luo uuden paikallisen silmukkamuuttujan, joten sulkeumat kaappaavat toisistaan riippumattomat upvaluet.
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)while-silmukan muuttujan sudenkuoppa
while-silmukassa kaikki sulkeumat jakavat saman upvaluen ja näkevät lopullisen arvon, jos yksi muuttuvaan muuttujaan sulkeutuva muuttuja kaapataan.
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!)Uuden paikallisen muuttujan kaappaaminen
Jos haluatte kaapata while-silmukassa toisistaan riippumattomia arvoja, esitelkää silmukan rungon sisällä uusi paikallinen muuttuja.
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]() == 2Jaetun tilan moduulimalli
Moduuli voi tarjota useita funktioita, jotka jakavat yksityisen tilataulukon upvaluejen kautta.
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,
}
endAliakset ja muuttaminen
Olkaa varovaisia: kaikki samaan upvalueen viittaavat sulkeumat näkevät saman muutoksen välittömästi. Tämä on tehokasta, mutta voi aiheuttaa tahattomia riippuvuuksia.
Upvaluen identiteetti
debug.upvalueid(f, n) palauttaa funktion f n:nnen upvaluen yksilöllisen identiteetin. Kaksi sulkeumaa, joilla on sama upvalue-tunniste, jakavat saman solun.
debug.upvaluejoin
debug.upvaluejoin(f1, n1, f2, n2) saa funktion f1 n:nnen upvaluen jakamaan saman solun funktion f2 n:nnen upvaluen kanssa. Tämä on matalan tason virheenkorjaustyökalu.
Käytännön mallit
- Getter- ja setter-parit, jotka jakavat yksityisen muuttujan.
- Tapahtumalaskuri, jonka nollaus on tarjolla useiden sulkeumien kautta.
- Useiden API-funktioiden jakama moduulin tila.
Jaetun upvaluen kysymys
Samassa näkyvyysalueessa luodaan kaksi sulkeumaa, get ja set, jotka molemmat kaappaavat value-muuttujan. Jos kutsutaan set(99), mitä get() palauttaa?
Kertaus: jaetut upvaluet
Saman näkyvyysalueen sulkeumat jakavat upvalue-solut. Muutokset näkyvät välittömästi kaikissa sulkeumissa, jotka jakavat solun. Tämä muodostaa Luan kapseloinnin ja moduulitilan perustan.
Opi Lua tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 40
- Oppitunnit
- 159
Usein kysytyt kysymykset
Onko oppitunti ”Sulkeumien jakamat upvaluet” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Lua Academy-oppimispolun 3 oppituntia, myös oppitunnin “Sulkeumien jakamat upvaluet”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Lua Academy-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Sulkeumien jakamat upvaluet”?
Tutkikaa useiden sulkeumien yhteistä upvaluea ja muuttamisen vaikutuksia. Harjoittelet Lua Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Lua Academy-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Lua Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.
Kuinka kauan ”Sulkeumien jakamat upvaluet”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Lua Academy-oppitunnilla?
Kyllä. Jokainen Lua Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Mitä ovat upvaluet?
- Sulkeumien jakamat upvaluet
- Tehdasfunktiot ja generaattorit
- Muistiointi sulkeumilla