Lua Academy · Oppitunti

Tehdasfunktiot ja generaattorit

Käyttäkää sulkeumia tehdasfunktioina määritettyjen funktioinstanssien tuottamiseen.

Oppitunti 3/413 vaihetta

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))  -- 15

Muokattava 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 4

Vä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) end

Osittainen 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))  -- 15

Muistioiva 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
end

Tilallinen 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
end

Generaattorit 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))  -- 7

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

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 ”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

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