Menu
Coddy logo textTech

Index-Signaturen

Teil des Abschnitts Einführung in Luau der Lua-Journey von Coddy. Lektion 72 von 73.

Du bist im Kapitel über Tabellen bereits auf Map-Typen wie {[string]: number} gestoßen: eine Index-Signatur: Jeder String-Schlüssel bildet einen Zahlenwert ab. Sie sind besonders nützlich, wenn die Schlüssel beim Schreiben des Codes noch nicht bekannt sind: Zähler, Einstellungen, Caches, Punktzahlen – alles, was zur Laufzeit aufgebaut wird.

type Counts = {[string]: number}

local counts: Counts = {}
counts["potion"] = 3   -- beliebiger String-Schlüssel ist erlaubt
counts["sword"] = 1
counts["potion"] += 1  -- Werte werden als Zahlen geprüft

Zwei Fakten zur Laufzeit sind bei der Arbeit mit Maps wichtig. Erstens liefert das Lesen eines Schlüssels, der nie gesetzt wurde, nil: Das klassische Zählmuster behandelt dies mit or und verwandelt „fehlend“ in 0:

counts[item] = (counts[item] or 0) + 1

Zweitens durchläuft pairs() die Schlüssel einer Map in keiner garantierten Reihenfolge: Beim zweimaligen Ausführen desselben Programms können die Schlüssel in einer anderen Reihenfolge besucht werden. Wenn die Ausgabe vorhersehbar sein muss, sammelst du die Schlüssel in einem Array, sortierst sie mit table.sort und durchläufst stattdessen das sortierte Array:

local keys: {string} = {}
for key in pairs(counts) do
    table.insert(keys, key)
end
table.sort(keys)
for _, key in ipairs(keys) do
    print(`{key}: {counts[key]}`)
end
challenge icon

Aufgabe

Einfach

Zähle Beute-Drops mit einer typisierten Map.

  • Deklariere type Counts = {[string]: number}.
  • Schreibe countItems(items: {string}): Counts, das eine neue Counts-Map erstellt und zählt, wie oft jeder String vorkommt (verwende das Muster (counts[item] or 0) + 1).
  • Erstelle local loot: {string} = {"potion", "sword", "potion", "shield", "potion", "sword"} und zähle sie.
  • Gib für jedes unterschiedliche Element eine Zeile im Format [name]: [count] in alphabetischer Reihenfolge aus: Sammle die Schlüssel, sortiere sie mit table.sort und gib sie anschließend aus.

Erwartete Ausgabe:

potion: 3
shield: 1
sword: 2

Probier es selbst

-- Schreibe Code hier
-- 1) type Counts = {[string]: number}
-- 2) countItems(items: {string}): Counts mit (counts[item] or 0) + 1
-- 3) zähle das loot-Array aus der Aufgabe
-- 4) sammle keys, table.sort sie, gib `{name}: {count}` Zeilen aus
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Einführung in Luau

Übe selbstständig: Online-Lua-Compiler