Schlüssel in Variablen
Der Schlüssel in eckigen Klammern muss nicht ausgeschrieben sein. Er kann in einer Variable stehen oder von einem Parameter oder aus einer Schleife kommen:
local preise = {Karotten = 5, Kartoffeln = 8, Erdbeeren = 12}
local pflanze = "Kartoffeln"
print(preise[pflanze])Das gibt Folgendes aus:
8Lua schaut zuerst in die Variable pflanze, findet darin den Text "Kartoffeln" und liest dann den Wert mit diesem Schlüssel. So schreibst du Code für einen Schlüssel, den du beim Schreiben des Programms noch nicht kennst: die Pflanze, die ein Kunde verlangt, oder jede Pflanze in einer Liste.
Und jetzt der klassische Fehler. Nach dem Punkt steht immer der Schlüssel selbst, nie eine Variable. preise.pflanze bedeutet preise["pflanze"]: Der Schlüssel ist der Text "pflanze", und den gibt es in der Tabelle nicht:
local preise = {Karotten = 5, Kartoffeln = 8, Erdbeeren = 12}
local pflanze = "Kartoffeln"
print(preise.pflanze)
print(preise["pflanze"])
print(preise[pflanze])Das gibt Folgendes aus:
nil
nil
8Also: Wenn du den Schlüssel beim Schreiben des Codes kennst, benutze einen Punkt (preise.Kartoffeln). Steht der Schlüssel in einer Variable, benutze eckige Klammern ohne Anführungszeichen (preise[pflanze]). Mit Anführungszeichen ist es wieder nur ein Text: preise["pflanze"] ist dasselbe wie preise.pflanze.
Schlüssel in Variablen sind in Funktionen und Schleifen am nützlichsten. Diese Funktion funktioniert für jede Pflanze, auch für eine, die du später zur Tabelle hinzufügst:
local preise = {Karotten = 5, Kartoffeln = 8, Zucchini = 20}
local function preisVon(pflanze, menge)
return preise[pflanze] * menge
end
print(preisVon("Karotten", 3))
print(preisVon("Zucchini", 2))Das gibt Folgendes aus:
15
40Hättest du darin aus Versehen preise.pflanze * menge geschrieben, würde das Programm mit attempt to perform arithmetic on a nil value (field 'pflanze') enden. Die Meldung nennt den Schlüssel, den Lua gesucht hat, 'pflanze': Das ist das Zeichen, dass du den Namen der Variable geschrieben hast, statt ihren Wert zu benutzen. Und wenn der Schlüssel aus einer Variable nicht in der Tabelle ist, steht in der Meldung ein Fragezeichen statt eines Namens, weil Lua nicht weiß, woher der Schlüssel kam: preisVon("Mais", 1) endet mit attempt to perform arithmetic on a nil value (field '?').
Noch ein Detail: Ein Schlüssel kann auch eine Zahl sein, und eine Zahl ist ein anderer Schlüssel als ein Text. t[1] und t["1"] sind zwei verschiedene Schlüssel.
So schreibst du es:
Anweisungen
- 1
Das Programm endet mit einem Fehler. Behebe die Funktion
preisVon, sodass sie den Preis der Pflanze im Parameterpflanzeliest. Das Programm gibt Folgendes aus:3 Karotten: 15 Münzen - 2
Ein Kunde hat eine Liste mitgebracht, was er möchte,
bestellung: ein Stück von jeder Pflanze. Gehe sie am Ende des Programms mitipairsdurch und gib den Preis jeder Pflanze aus. Emma verkauft an ihrem Stand keinen Mais (den behält sie für die Hühner), also hatpreisekeinen Schlüssel"Mais": Gib dafürMais: nicht im Angebotaus. Das Programm gibt Folgendes aus:Zucchini: 20 Erdbeeren: 12 Mais: nicht im Angebot Karotten: 5 - 3
Gib unter der Schleife aus, wie viel der Kunde für die Pflanzen zahlt, die Emma verkauft:
Summe: 37 Münzen