Shrnutí
V této lekci jste se naučili, že:
- Tabulka může vedle dat obsahovat i funkce. Taková tabulka je objekt.
function farma.popis(f) … endje zkratka profarma.popis = function(f) … end. Istringamathjsou tabulky funkcí. - Dvojtečka předá samotný objekt:
plodina:dalsiDen()je zkratka proplodina.dalsiDen(plodina)afunction plodina:dalsiDen()profunction plodina.dalsiDen(self). Uvnitř takové metody jeselfobjekt, na kterém byla zavolána. Tečka místo dvojtečky při volání způsobí chybuattempt to index a nil value (local 'self'). - Konstruktor je funkce, která vytvoří objekt a vrátí ho. Bez
returndostanetenil:attempt to index a nil value (local 'mrkev'). setmetatable(t, mt)dá tabulce metatabulku. Její__indexříká, kde hledat klíče, kterétnemá. Tak objekty sdílejí metody a tak i text najdestring.upperpros:upper().- Třída je tabulka, která drží metody a je metatabulkou svých instancí:
local Plodina = {},Plodina.__index = Plodina, konstruktorPlodina.new, který zavolásetmetatable(plodina, Plodina), a metody jakofunction Plodina:dalsiDen(). BezPlodina.__index = Plodinapřijde chybaattempt to call a nil value (method 'dalsiDen'). - Metametody naučí objekty spolupracovat se zbytkem jazyka:
__tostringsprintatostring(ale ne s..),__eqs==,__lts<,>atable.sort,__les<=i>=a__adds+. - Třída dědí od jiné pomocí
setmetatable(Strom, {__index = Plodina}). Její konstruktor zavolá konstruktor rodiče a potomsetmetatable(strom, Strom). Metoda se stejným názvem metodu rodiče přepíše aPlodina.popis(self)zavolá verzi rodiče. Metametody se nedědí.
V příští lekci, Korutiny, budete psát funkce, které se umí uprostřed zastavit a později pokračovat, třeba pro postavu, která každý den udělá jednu věc.
Ale nejdřív si celou lekci procvičte. Ema prodává na trhu a program v editoru používá třídu Produkt, která ještě neexistuje, takže skončí chybou attempt to index a nil value (global 'Produkt').
Jak psát:
Pokyny
Nad stanek napište třídu Produkt. Její konstruktor Produkt.new(nazev, cena, pocet) vytvoří produkt s těmito třemi klíči a její __tostring ho popíše jako níže. Program vypíše:
Dýně: 3 ks, 20 mincí za kus
Mrkev: 10 ks, 5 mincí za kus
Jahody: 6 ks, 12 mincí za kusPřidejte metodu Produkt:prodej(kolik). Prodá kolik kusů, ale nikdy víc, než kolik jich zbývá, a vrátí mince, které za ně Ema dostane. Pod cyklem prodejte 2 dýně a 15 mrkví (zbývá jich jen 10), sečtěte mince a vypište je:
Mince: 90Večer chce Ema vidět, co jí zbylo, od nejlevnějšího. Přidejte třídě Produkt metametodu __lt, která porovnává ceny, seřaďte stánek pomocí table.sort a vypište ho znovu. Program skončí takto:
Mince: 90
Mrkev: 0 ks, 5 mincí za kus
Jahody: 6 ks, 12 mincí za kus
Dýně: 1 ks, 20 mincí za kusZačněte programovat zdarma
9/9