Schlüssel und Werte
In der Lektion über Listen hat eine Tabelle ihre Elemente der Reihe nach unter den Nummern 1, 2, 3 … gespeichert. Das funktioniert für eine Einkaufsliste. Aber Emma will auch aufschreiben, was in ihrer Scheune liegt: 12 Karotten, 30 Kartoffeln und 4 Zucchini. Eine Liste {12, 30, 4} würde die Zahlen enthalten, aber nichts darin würde sagen, welche Zahl zu welcher Pflanze gehört.
Eine Tabelle kann mehr als eine Liste. Statt der Nummern 1, 2, 3 kann sie Namen benutzen:
-- Emmas Scheune
local scheune = {Karotten = 12, Kartoffeln = 30, Zucchini = 4}
print(scheune.Karotten)
print(scheune["Kartoffeln"])Das gibt Folgendes aus:
12
30Eine so benutzte Tabelle heißt Dictionary. So wie du in einem echten Wörterbuch ein Wort nachschlägst, um seine Bedeutung zu finden, schlägst du einen Schlüssel (Karotten) nach, um seinen Wert (12) zu finden. In den geschweiften Klammern stehen Schlüssel-Wert-Paare, durch Kommas getrennt: der Schlüssel, = und der Wert. Ein Wert kann alles sein: eine Zahl, ein Text, true oder false, sogar eine andere Tabelle.
Lua hat keinen eigenen Typ für Dictionaries. Es ist dieselbe Tabelle, die du von Listen kennst, und type(scheune) ist "table". Eine Liste ist einfach eine Tabelle, deren Schlüssel 1, 2, 3 … sind.
Es gibt zwei Möglichkeiten, einen Wert zu lesen, und sie bedeuten genau dasselbe:
scheune.Karotten: ein Punkt und der Name des Schlüssels;scheune["Karotten"]: der Schlüssel als Text in eckigen Klammern, wie ein Index in einer Liste.
Der Punkt ist kürzer, deshalb siehst du ihn öfter. Er funktioniert aber nur bei Schlüsseln, die den Regeln für Variablennamen folgen: Buchstaben (ohne Umlaute), Ziffern und _, nicht mit einer Ziffer beginnend und kein Schlüsselwort wie end. Ein Schlüssel mit einem Leerzeichen, wie Rote Bete, muss in eckigen Klammern und Anführungszeichen stehen, sowohl in den geschweiften Klammern als auch beim Lesen:
local scheune = {Karotten = 12, ["Rote Bete"] = 9}
print(scheune["Rote Bete"])Das gibt Folgendes aus:
9Ohne die Klammern liest Lua nur Rote und weiß mit Bete nichts anzufangen: {Rote Bete = 9} endet mit main.lua:1: '}' expected near 'Bete'.
Eine Tabelle mit mehr Paaren liest sich leichter, wenn jedes Paar in einer eigenen Zeile steht. Ein Komma nach dem letzten Paar ist erlaubt, was praktisch ist, wenn du später eine Zeile hinzufügst:
local karotte = {
name = "Karotte",
tage = 3,
verkaufsPreis = 5,
}
print(karotte.name .. " bringt " .. karotte.verkaufsPreis .. " Münzen")Das gibt Folgendes aus:
Karotte bringt 5 MünzenUm ein ganzes Dictionary zu sehen, hilft print(scheune) nicht: Wie bei Listen gibt es nur table: 0x… aus. Und table.concat verbindet nur die Elemente einer Liste. Später in dieser Lektion lernst du, jedes Paar auszugeben.
Typische Fehler:
- Ein fehlendes Komma zwischen zwei Paaren:
{Karotten = 12 Kartoffeln = 30}endet mitmain.lua:1: '}' expected near 'Kartoffeln'. - Ein Doppelpunkt statt
=, wie manche andere Sprachen ihn schreiben:{Karotten: 12}endet mitmain.lua:1: <name> expected near '12'. - Ein Schlüssel in Anführungszeichen, aber ohne die eckigen Klammern:
{"Karotten" = 12}endet mitmain.lua:1: '}' expected near '='.
So schreibst du es:
Anweisungen
- 1
Gib aus, wie viele Karotten und Kartoffeln in der Scheune liegen. Lies die Zahlen aus der Tabelle: einmal mit einem Punkt, einmal mit eckigen Klammern. Das Programm gibt Folgendes aus:
Karotten: 12 Kartoffeln: 30 - 2
Emma hat 9 Knollen Rote Bete geerntet. Füge in den geschweiften Klammern ein Paar mit dem Schlüssel
"Rote Bete"und dem Wert9hinzu. Der Schlüssel hat ein Leerzeichen, deshalb braucht er eckige Klammern. - 3
Gib am Ende des Programms die Rote Bete und die Summe aller drei Pflanzen aus. Lies jede Zahl aus der Tabelle:
Rote Bete: 9 Summe: 51