Výpis objektů

Když objekt vypíšete, print(mrkev), Lua neví, co je na něm důležité. Vypíše table: a adresu tabulky v paměti počítače, třeba table: 0x109010, a to vám moc neřekne. Pomůže metametoda __tostring. Je to funkce, která dostane objekt a vrátí text, a ten pak použijí print i tostring:

local Plodina = {}
Plodina.__index = Plodina

function Plodina.new(nazev, dny)
    local plodina = {nazev = nazev, dny = dny, vek = 0}
    setmetatable(plodina, Plodina)
    return plodina
end

function Plodina:dalsiDen()
    self.vek = self.vek + 1
end

function Plodina:__tostring()
    if self.vek >= self.dny then
        return self.nazev .. " (zralá)"
    end
    return self.nazev .. " (den " .. self.vek .. "/" .. self.dny .. ")"
end

local pole = {Plodina.new("Pšenice", 2), Plodina.new("Mrkev", 3), Plodina.new("Dýně", 7)}
for den = 1, 2 do
    for _, plodina in ipairs(pole) do
        plodina:dalsiDen()
    end
end

for _, plodina in ipairs(pole) do
    print(plodina)
end
print("První na poli: " .. tostring(pole[1]))

Vypíše:

Pšenice (zralá)
Mrkev (den 2/3)
Dýně (den 2/7)
První na poli: Pšenice (zralá)

Plodina je metatabulkou každé plodiny, a tak jedna metametoda __tostring ve třídě Plodina funguje pro všechny. Píše se jako každá jiná metoda a self je plodina, kterou má popsat: function Plodina:__tostring() znamená Plodina.__tostring = function(self). Uvnitř může dělat cokoli, co umí metoda, třeba zjistit, jestli je plodina zralá. Lua ji zavolá sama, kdykoli potřebuje objekt jako text: v print, v tostring a pro %s ve string.format, takže string.format("%s!", pole[1]) dá Pšenice (zralá)!.

Typické chyby:

  • Spojování pomocí ... Operátor .. metametodu __tostring nepoužívá. Když je mrkev plodina, "Na poli: " .. mrkev skončí chybou attempt to concatenate a table value (local 'mrkev'). Objekt nejdřív převeďte na text pomocí tostring(mrkev), jako v posledním řádku příkladu.
  • Vypsání místo vrácení. __tostring musí text vrátit pomocí return. Když ho jen vypíše a nic nevrátí, program skončí chybou '__tostring' must return a string.

Pokyny

Spusťte program: slepici vypíše jako table: s adresou. Přidejte třídě Slepice metametodu __tostring, aby print(zlatka) vypsalo:

Zlatka (2 vejce)

Pod něj vypište řádek Nejlepší slepice: Zlatka (2 vejce). Sestavte ho pomocí .. ze samotné slepice, zlatka, ne z textu, který napíšete ručně.

Zlatka (2 vejce)
Nejlepší slepice: Zlatka (2 vejce)

Perla snesla 5 vajec a „Perla (5 vejce)“ by bylo špatně. Upravte __tostring tak, aby pro 0 vajec a pro 5 a víc vajec psala vajec. Vytvořte Perlu pomocí Slepice.new, nechte ji snést 5 vajec a vypište ji pod ostatní řádky:

Zlatka (2 vejce)
Nejlepší slepice: Zlatka (2 vejce)
Perla (5 vajec)

Začněte programovat zdarma

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

Nebo se registrujte pomocí:

6/9