Lua Academy · Oppitunti

Sulkeumien jakamat upvaluet

Tutkikaa useiden sulkeumien yhteistä upvaluea ja muuttamisen vaikutuksia.

Oppitunti 2/413 vaihetta

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())  -- 42

Miksi 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())  -- 1

Silmukkamuuttujan 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]() == 2

Jaetun 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,
  }
end

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

Aloita maksutta

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

  1. Mitä ovat upvaluet?
  2. Sulkeumien jakamat upvaluet
  3. Tehdasfunktiot ja generaattorit
  4. Muistiointi sulkeumilla
← Takaisin: Lua Academy