Datensätze
Bisher enthielten Emmas Dictionaries viele Dinge derselben Art: Pflanzen und ihre Anzahlen, Pflanzen und ihre Preise. Eine Tabelle kann aber auch eine einzelne Sache mit mehreren Werten beschreiben. So eine Tabelle nennt man oft einen Datensatz (englisch „record“) und ihre Schlüssel Felder:
local karotte = {name = "Karotte", tage = 3, samenPreis = 2, verkaufsPreis = 5}
print(karotte.name .. " wächst in " .. karotte.tage .. " Tagen.")
print("Gewinn: " .. (karotte.verkaufsPreis - karotte.samenPreis) .. " Münzen")Das gibt Folgendes aus:
Karotte wächst in 3 Tagen.
Gewinn: 3 MünzenEs ist dieselbe Art von Tabelle wie die Scheune, nur anders benutzt. In der Scheune sind die Schlüssel die Daten: Emma kann jederzeit eine beliebige Pflanze hinzufügen. In einem Datensatz sind die Schlüssel fest und im Voraus bekannt. Jede Pflanze hat einen name, tage, einen samenPreis und einen verkaufsPreis, und das Programm liest sie mit einem Punkt. Die Werte können verschiedene Typen haben:
local bella = {name = "Bella", art = "Kuh", alter = 4, gemolken = false}
bella.gemolken = true
print(bella.name, bella.art, bella.alter, bella.gemolken)Bella Kuh 4 trueDatensätze passen gut zu Funktionen. Statt den Namen, die Tage und die Preise einzeln zu übergeben, übergibst du einen Datensatz, und die Funktion liest die Felder, die sie braucht:
local function gewinn(pflanze)
return pflanze.verkaufsPreis - pflanze.samenPreis
end
local karotte = {name = "Karotte", tage = 3, samenPreis = 2, verkaufsPreis = 5}
local kartoffel = {name = "Kartoffel", tage = 4, samenPreis = 3, verkaufsPreis = 8}
print(gewinn(karotte), gewinn(kartoffel))3 5Eine Funktion kann einen Datensatz auch erstellen und zurückgeben. Brauchst du viele Datensätze derselben Form, schreibst du ihre Felder nur einmal, in der Funktion:
local function neuesBeet(pflanze)
return {pflanze = pflanze, tag = 0, gegossen = false}
end
local beet = neuesBeet("Kürbis")
print(beet.pflanze, beet.tag, beet.gegossen)Kürbis 0 falsepflanze = pflanze sieht vielleicht seltsam aus. Links von = steht der Schlüssel, das Feld pflanze. Rechts steht sein Wert: der Parameter pflanze, der in diesem Aufruf "Kürbis" enthält. Jeder Aufruf gibt eine neue Tabelle zurück, also hat jedes Beet seine eigenen Felder.
Ein typischer Fehler ist ein Tippfehler im Namen eines Feldes. Lua prüft die Namen von Feldern nicht, also ist karotte.verkaufspreis (mit kleinem p) einfach nil, und eine Rechnung damit endet mit attempt to perform arithmetic on a nil value (field 'verkaufspreis'). Wenn du in einem Fehler field '…' siehst, vergleiche den Namen in der Meldung mit dem Namen in der Tabelle.
So schreibst du es:
Anweisungen
- 1
Schreibe eine Funktion
beschreibung(pflanze), die einen Text über die Pflanze, die sie bekommt, mit ihrem Gewinn zurückgibt (nicht ausgibt): der Verkaufspreis minus der Samenpreis. Gibbeschreibung(kuerbis)aus:Kürbis: 7 Tage, Gewinn 15 Münzen - 2
Erstelle darunter einen Datensatz
erdbeeremit denselben vier Feldern wie der Kürbis: dem Namen"Erdbeere", 5 Tagen, Samen für 4 Münzen und einem Verkaufspreis von 12 Münzen. Gib seine Beschreibung aus:Erdbeere: 5 Tage, Gewinn 8 Münzen - 3
Schreibe eine Funktion
neuePflanze(name, tage, samenPreis, verkaufsPreis), die einen neuen Datensatz mit diesen vier Feldern zurückgibt. Erstelle damit Mais: 6 Tage, Samen für 3 Münzen, ein Verkaufspreis von 10 Münzen. Gib seine Beschreibung aus:Mais: 6 Tage, Gewinn 7 Münzen