Zusammenfassung
In dieser Lektion hast du gelernt:
- Eine Tabelle kann neben ihren Daten Funktionen enthalten. Eine solche Tabelle ist ein Objekt.
function hof.beschreiben(h) … endist die Kurzform vonhof.beschreiben = function(h) … end. Auchstringundmathsind Tabellen mit Funktionen. - Der Doppelpunkt übergibt das Objekt selbst:
pflanze:wachsen()ist die Kurzform vonpflanze.wachsen(pflanze)undfunction pflanze:wachsen()vonfunction pflanze.wachsen(self). In einer solchen Methode istselfdas Objekt, auf dem sie aufgerufen wurde. Ein Punkt statt des Doppelpunkts beim Aufruf ergibtattempt to index a nil value (local 'self'). - Ein Konstruktor ist eine Funktion, die ein Objekt erzeugt und zurückgibt. Ohne
returnbekommst dunil:attempt to index a nil value (local 'karotte'). setmetatable(t, mt)gibt einer Tabelle eine Metatabelle. Ihr__indexsagt, wo nach Schlüsseln gesucht wird, dietnicht hat. So teilen Objekte ihre Methoden, und so findet ein Textstring.upperfürs:upper().- Eine Klasse ist eine Tabelle, die die Methoden enthält und die Metatabelle ihrer Instanzen ist:
local Pflanze = {},Pflanze.__index = Pflanze, ein KonstruktorPflanze.new, dersetmetatable(pflanze, Pflanze)aufruft, und Methoden wiefunction Pflanze:wachsen(). OhnePflanze.__index = Pflanzebekommst duattempt to call a nil value (method 'wachsen'). - Metamethoden bringen Objekte dazu, mit dem Rest von Lua zu arbeiten:
__tostringmitprintundtostring(aber nicht mit..),__eqmit==,__ltmit<,>undtable.sort,__lemit<=und>=und__addmit+. - Eine Klasse erbt von einer anderen mit
setmetatable(Baum, {__index = Pflanze}). Ihr Konstruktor ruft den Konstruktor der Elternklasse auf und dannsetmetatable(baum, Baum). Eine Methode mit demselben Namen überschreibt die der Elternklasse, undPflanze.beschreiben(self)ruft die Version der Elternklasse auf. Metamethoden werden nicht vererbt.
Nach dieser Lektion kommt das letzte kleine Projekt, ein Register von Emmas Tieren, in dem du Zeichenketten und Objekte einsetzt. Dann schreibst du in der Lektion über Koroutinen Funktionen, die mittendrin pausieren und später weitermachen können, zum Beispiel für eine Figur, die jeden Tag eine Sache tut.
Fasse aber zuerst diese Lektion zusammen. Emma verkauft auf dem Markt, und das Programm im Editor benutzt eine Klasse Produkt, die es noch nicht gibt, deshalb endet es mit attempt to index a nil value (global 'Produkt').
So schreibst du es:
Anweisungen
- 1
Schreibe über
standdie KlasseProdukt. Ihr KonstruktorProdukt.new(name, preis, anzahl)erzeugt ein Produkt mit diesen drei Schlüsseln, und ihr__tostringbeschreibt es wie unten. Das Programm gibt aus:Kürbis: 3 übrig, je 20 Münzen Karotte: 10 übrig, je 5 Münzen Erdbeere: 6 übrig, je 12 Münzen - 2
Füge eine Methode
Produkt:verkaufen(menge)hinzu. Sie verkauftmengeStück, aber nie mehr, als noch übrig sind, und gibt die Münzen zurück, die Emma dafür bekommt. Verkaufe unter der Schleife 2 Kürbisse und 15 Karotten (es sind nur noch 10 übrig), addiere die Münzen und gib sie aus:Münzen: 90 - 3
Am Abend will Emma sehen, was übrig ist, das Billigste zuerst. Füge
Produktein__lthinzu, das die Preise vergleicht, sortiere den Stand mittable.sortund gib ihn noch einmal aus. Das Programm endet so:Münzen: 90 Karotte: 0 übrig, je 5 Münzen Erdbeere: 6 übrig, je 12 Münzen Kürbis: 1 übrig, je 20 Münzen