Tehdasfunktiot ja generaattorit
Käyttäkää sulkeumia tehdasfunktioina määritettyjen funktioinstanssien tuottamiseen.
Tehdasfunktiot ja generaattorit on ilmainen Lua Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/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.
Mikä on tehdasfunktio?
Tehdasfunktio on funktio, joka luo ja palauttaa muita funktioita. Niiden toiminta määräytyy argumenttien ja upvaluejen perusteella.
Yksinkertainen kertojatehdas
Jokainen multiplier-kutsu palauttaa uuden sulkeuman, joka kaappaa eri factor-arvon.
local function multiplier(factor)
return function(x) return x * factor end
end
local double = multiplier(2)
local triple = multiplier(3)
print(double(5)) -- 10
print(triple(5)) -- 15Muokattava lokinkirjaajatehdas
Lokinkirjaajatehdas kaappaa etuliitemerkkijonon ja palauttaa lokifunktion.
local function makeLogger(prefix)
return function(msg)
print("[" .. prefix .. "] " .. msg)
end
end
local info = makeLogger("INFO")
local warn = makeLogger("WARN")
info("started")
warn("low memory")Laskurigeneraattori
Generaattori ylläpitää sisäistä tilaa ja tuottaa jokaisella kutsulla uuden arvon.
local function counter(start, step)
local n = start - step
return function()
n = n + step
return n
end
end
local evens = counter(0, 2)
print(evens(), evens(), evens()) -- 0 2 4Välialuegeneraattori
Välialuegeneraattori tuottaa arvoja arvosta from arvoon to ja palauttaa nil-arvon, kun arvot loppuvat.
local function range(from, to, step)
step = step or 1
local i = from - step
return function()
i = i + step
if i <= to then return i end
end
end
for v in range(1, 5) do print(v) endOsittainen soveltaminen
Tehdas soveltaa osan argumenteista valmiiksi ja luo funktion erikoistuneen version.
local function partial(fn, ...)
local args = {...}
return function(...)
local all = {table.unpack(args)}
for _, v in ipairs({...}) do all[#all+1] = v end
return fn(table.unpack(all))
end
end
local add = function(a,b) return a+b end
local add10 = partial(add, 10)
print(add10(5)) -- 15Muistioiva tehdas
Tehdas voi rakentaa muistioivan version paljon laskentaa vaativasta funktiosta.
local function memoize(fn)
local cache = {}
return function(x)
if cache[x] == nil then cache[x] = fn(x) end
return cache[x]
end
endTilallinen tokenisaattori
Tokenisaattoritehdas kaappaa syötemerkkijonon ja sijainnin ja tuottaa jokaisella kutsulla seuraavan tokenin.
local function lexer(input)
local pos = 1
return function()
if pos > #input then return nil end
local token = input:match("%S+", pos)
if token then pos = pos + #token + 1 end
return token
end
endGeneraattorit ja korutiinit
Sulkeumiin perustuvat generaattorit ovat yksinkertaisempia, mutta säilyttävät kaiken tilansa upvalueissa. Korutiineihin perustuvat generaattorit ovat tehokkaampia ja sallivat yield-kutsun missä tahansa monimutkaisen logiikan kohdassa.
Funktioiden mallipohjat
Tehtaat luovat funktioiden mallipohjia: luonnin yhteydessä parametroitavia yleisiä rakenteita, joita voidaan käyttää uudelleen eri asetuksilla.
Currying
Currying-funktio ottaa argumentit yksi kerrallaan ja palauttaa uuden funktion, kunnes kaikki argumentit on annettu.
local function curry2(fn)
return function(a)
return function(b)
return fn(a, b)
end
end
end
local curriedAdd = curry2(function(a,b) return a+b end)
print(curriedAdd(3)(4)) -- 7Tehdasfunktioita koskeva kysymys
Mikä on tehdasfunktioiden keskeinen ominaisuus?
Kertaus: tehdasfunktiot
Tehdasfunktiot tuottavat määritettyjä sulkeumia, mikä mahdollistaa osittaisen soveltamisen, generaattorit, muistioinnin ja curryingin. Ne ovat yksi Luan tehokkaimmista funktionaalisista ohjelmointimalleista.
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 ”Tehdasfunktiot ja generaattorit” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Lua Academy-oppimispolun 3 oppituntia, myös oppitunnin “Tehdasfunktiot ja generaattorit”. 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 ”Tehdasfunktiot ja generaattorit”?
Käyttäkää sulkeumia tehdasfunktioina määritettyjen funktioinstanssien tuottamiseen. 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 3/4.
Kuinka kauan ”Tehdasfunktiot ja generaattorit”-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