Záznamy
Dosud Eminy slovníky držely spoustu věcí stejného druhu: plodiny a jejich počty, plodiny a jejich ceny. Tabulka ale může popisovat i jednu věc pomocí několika hodnot. Takové tabulce se často říká záznam:
local mrkev = {nazev = "Mrkev", dny = 3, cenaSemen = 2, prodejniCena = 5}
print(mrkev.nazev .. " roste " .. mrkev.dny .. " dny.")
print("Zisk: " .. (mrkev.prodejniCena - mrkev.cenaSemen) .. " mince")Vypíše:
Mrkev roste 3 dny.
Zisk: 3 minceJe to stejná tabulka jako stodola, jen jinak použitá. Ve stodole jsou daty samotné klíče: Ema může kdykoli přidat jakoukoli plodinu. V záznamu jsou klíče pevné a známé předem. Každá plodina má nazev, dny, cenaSemen a prodejniCena a program je čte pomocí tečky. Hodnoty můžou mít různé typy:
local bella = {jmeno = "Bella", druh = "kráva", vek = 4, podojena = false}
bella.podojena = true
print(bella.jmeno, bella.druh, bella.vek, bella.podojena)Bella kráva 4 trueZáznamy se skvěle hodí k funkcím. Místo abyste funkci předávali název, dny a ceny jednotlivě, předáte jí jeden záznam a funkce si z něj přečte, co potřebuje:
local function zisk(plodina)
return plodina.prodejniCena - plodina.cenaSemen
end
local mrkev = {nazev = "Mrkev", dny = 3, cenaSemen = 2, prodejniCena = 5}
local brambory = {nazev = "Brambory", dny = 4, cenaSemen = 3, prodejniCena = 8}
print(zisk(mrkev), zisk(brambory))3 5Funkce může záznam také vytvořit a vrátit. Když potřebujete hodně záznamů stejného tvaru, napíšete jejich klíče jen jednou, ve funkci:
local function novyZahon(plodina)
return {plodina = plodina, den = 0, zalito = false}
end
local zahon = novyZahon("dýně")
print(zahon.plodina, zahon.den, zahon.zalito)dýně 0 falseplodina = plodina může vypadat divně. Vlevo od = je klíč plodina. Vpravo je jeho hodnota: parametr plodina, ve kterém je při tomto volání "dýně". Každé volání vrátí novou tabulku, takže každý záhon má své vlastní hodnoty.
Typická chyba je překlep v názvu klíče. Lua názvy klíčů nekontroluje, takže mrkev.prodejnicena (s malým c) je prostě nil a počítání s ním skončí chybou attempt to perform arithmetic on a nil value (field 'prodejnicena'). Když v chybě uvidíte field '…', porovnejte název z hlášky s názvem v tabulce.
Jak psát:
Pokyny
Napište funkci popis(plodina), která vrátí (ne vypíše) text o plodině, kterou dostane, i s jejím ziskem: prodejní cena minus cena semen. Vypište popis(dyne):
Dýně: 7 dní, zisk 15 mincíPod to vytvořte záznam jahody se stejnými čtyřmi klíči, jaké má dýně: název "Jahody", 5 dní, semena za 4 mince a prodejní cena 12 mincí. Vypište jeho popis:
Jahody: 5 dní, zisk 8 mincíNapište funkci novaPlodina(nazev, dny, cenaSemen, prodejniCena), která vrátí nový záznam s těmito čtyřmi klíči. Vytvořte s ní kukuřici: 6 dní, semena za 3 mince, prodejní cena 10 mincí. Vypište její popis:
Kukuřice: 6 dní, zisk 7 mincíZačněte programovat zdarma
6/10