Menu
Coddy logo textTech

Konstante Tables einfrieren

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

Eine konstante Tabelle hat eine Schwachstelle: Sie ist immer noch eine gewöhnliche Tabelle. Jeder Code, überall, kann UserRole.Admin = 99 schreiben — und deine "Konstanten" hören stillschweigend auf, konstant zu sein.

Luau schließt diese Lücke mit table.freeze. Das Einfrieren macht eine Tabelle zur Laufzeit schreibgeschützt: Jeder Versuch, ein Feld hinzuzufügen, zu ändern oder zu entfernen, wirft einen Fehler auf. Die gängige Praxis ist es, die Tabelle direkt dort einzufrieren, wo sie erstellt wird — table.freeze gibt dieselbe Tabelle zurück, bereit zur Zuweisung:

local Color = table.freeze({
    Red = 1,
    Green = 2,
    Blue = 3,
})

print(Color.Red) -- 1: Lesen funktioniert wie gewohnt
Color.Gold = 4   -- ✗ Fehler: Versuch, eine schreibgeschützte Tabelle zu ändern

Im Gegensatz zu allem anderen in diesem Kurs bisher ist dies ein Schutz zur Laufzeit — ein echter Fehler in dem Moment, in dem der Schreibzugriff ausgeführt wird, nicht nur eine Warnung zur Bearbeitungszeit. Es schützt selbst vor Code, den die Typprüfung nie gesehen hat.

Zwei nützliche Begleiter: table.isfrozen(t) gibt zurück, ob eine Tabelle eingefroren ist, und das Einfrieren ist flach (shallow) — verschachtelte Tabellen bleiben veränderlich, außer du frierst sie ebenfalls ein. Du kannst das Einfrieren auch nicht rückgängig machen: Einmal eingefroren, bleibt eine Tabelle eingefroren.

Eine eingefrorene konstante Tabelle zusammen mit einer Literal-Union für Parameter ergibt das vollständige Luau-Enum: benannte Laufzeitwerte, die niemand manipulieren kann, und Prüfungen zur Bearbeitungszeit überall dort, wo sie verwendet werden.

challenge icon

Aufgabe

Einfach

Erstelle eine frozen Konstantentabelle namens Color — baue sie auf und friere sie in einem Schritt mit table.freeze ein — mit folgendem Inhalt:

  • Red = 1
  • Green = 2
  • Blue = 3

Erstelle eine normale (nicht eingefrorene) Tabelle namens settings mit dem Feld volume = 5.

Gib jeweils in einer eigenen Zeile Folgendes aus:

  1. Color.Red
  2. Color.Blue
  3. ob Color eingefroren ist (table.isfrozen)
  4. ob settings eingefroren ist
  5. das Ergebnis des Versuchs, ein Feld zu Color innerhalb von pcall hinzuzufügen — rufe pcall(function() Color.Gold = 4 end) auf und gib den zurückgegebenen boolean aus

Probier es selbst

-- Schreibe Code hier
-- 1) local Color = table.freeze({Red = 1, Green = 2, Blue = 3})
-- 2) local settings = {volume = 5}
-- 3) print Color.Red, Color.Blue, beide isfrozen-Ergebnisse
-- 4) pcall den verbotenen Schreibvorgang und print den zurückgegebenen boolean
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