Menu
Coddy logo textTech

Konstante Tables einfrieren

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

Eine Konstantentabelle hat eine Schwäche: Sie ist immer noch eine gewöhnliche Tabelle. Jeder beliebige Code kann UserRole.Admin = 99 schreiben, und deine „Konstanten“ hören unbemerkt 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, löst einen Fehler aus. Das gängige Muster besteht darin, die Tabelle direkt beim Erstellen einzufrieren: table.freeze gibt dieselbe Tabelle zurück, die sofort zugewiesen werden kann:

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 genau in dem Moment, in dem der Schreibvorgang ausgeführt wird, und keine Warnung zur Bearbeitungszeit. Er schützt sogar vor Code, den der Typprüfer nie gesehen hat.

Zwei nützliche Begleiter: table.isfrozen(t) gibt zurück, ob eine Tabelle eingefroren ist, und das Einfrieren ist oberflächlich: Verschachtelte Tabellen bleiben veränderbar, sofern du sie nicht ebenfalls einfrierst. Du kannst eine Tabelle außerdem nicht wieder auftauen: Sobald sie eingefroren ist, bleibt sie eingefroren.

Eine eingefrorene Konstantentabelle zusammen mit einer Literalkombination für Parameter ist das vollständige Luau-Enum: benannte Laufzeitwerte, an denen niemand herumpfuschen kann, und eine Prüfung zur Bearbeitungszeit überall dort, wo sie verwendet werden.

challenge icon

Aufgabe

Einfach

Erstelle eine schreibgeschützte Konstantentabelle namens Color, erstelle sie und friere sie mit table.freeze in einem Schritt ein. Sie soll Folgendes enthalten:

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

Erstelle eine einfache (nicht schreibgeschützte) Tabelle namens settings mit einem Feld volume = 5.

Gib jeweils in einer eigenen Zeile Folgendes aus:

  1. Color.Red
  2. Color.Blue
  3. ob Color schreibgeschützt ist (table.isfrozen)
  4. ob settings schreibgeschützt ist
  5. das Ergebnis des Versuchs, innerhalb von pcall ein Feld zu Color hinzuzufügen: Rufe pcall(function() Color.Gold = 4 end) auf und gib den zurückgegebenen booleschen Wert 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

Übe selbstständig: Online-Lua-Compiler