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__tostringnepoužívá. Když jemrkevplodina,"Na poli: " .. mrkevskončí chybouattempt 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í.
__tostringmusí text vrátit pomocíreturn. Když ho jen vypíše a nic nevrátí, program skončí chybou'__tostring' must return a string.
Jak psát:
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
6/9