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) … end je zkratka pro farma.popis = function(f) … end. I string a math jsou tabulky funkcí.
  • Dvojtečka předá samotný objekt: plodina:dalsiDen() je zkratka pro plodina.dalsiDen(plodina) a function plodina:dalsiDen() pro function plodina.dalsiDen(self). Uvnitř takové metody je self objekt, na kterém byla zavolána. Tečka místo dvojtečky při volání způsobí chybu attempt to index a nil value (local 'self').
  • Konstruktor je funkce, která vytvoří objekt a vrátí ho. Bez return dostanete nil: attempt to index a nil value (local 'mrkev').
  • setmetatable(t, mt) dá tabulce metatabulku. Její __index říká, kde hledat klíče, které t nemá. Tak objekty sdílejí metody a tak i text najde string.upper pro s:upper().
  • Třída je tabulka, která drží metody a je metatabulkou svých instancí: local Plodina = {}, Plodina.__index = Plodina, konstruktor Plodina.new, který zavolá setmetatable(plodina, Plodina), a metody jako function Plodina:dalsiDen(). Bez Plodina.__index = Plodina přijde chyba attempt to call a nil value (method 'dalsiDen').
  • Metametody naučí objekty spolupracovat se zbytkem jazyka: __tostring s print a tostring (ale ne s ..), __eq s ==, __lt s <, > a table.sort, __le s <= i >= a __add s +.
  • Třída dědí od jiné pomocí setmetatable(Strom, {__index = Plodina}). Její konstruktor zavolá konstruktor rodiče a potom setmetatable(strom, Strom). Metoda se stejným názvem metodu rodiče přepíše a Plodina.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').

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 kus

Př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: 90

Več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 kus

Začněte programovat zdarma

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

9/9