Null-Sicherheit im Strict-Modus
Teil des Abschnitts Einführung in Luau der Lua-Journey von Coddy. Lektion 77 von 80.
Der häufigste Lua-Absturz lautet „attempt to index nil“: Code, der davon ausging, dass ein Wert vorhanden war, obwohl das nicht der Fall war. Luau setzt dem nil-Disziplin entgegen: Unter --!strict kann ein einfaches string niemals nil sein. Wenn nil tatsächlich möglich ist, muss der Typ das mit ? angeben:
--!strict
local nickname: string? = nil -- ok: string ODER nil
local username: string = nil -- ✗ Typfehler im strikten ModusDie Disziplin wirkt in beide Richtungen: Bei einem string? lässt dich der strikte Modus diesen nicht als String verwenden, bevor du nil ausgeschlossen hast. Das übliche Mittel ist ein einfacher Vergleich, der den Typ genauso eingrenzt wie eine typeof-Prüfung:
local function shout(name: string?): string
if name ~= nil then
return string.upper(name) -- name ist hier vom Typ string
end
return "NOBODY"
endWenn nil ein Fehler und kein gültiger Fall wäre, verwende assert: Nach assert(x ~= nil) behandelt der Prüfer x für den Rest des Gültigkeitsbereichs als nicht-nil. Zur Laufzeit löst assert den Absturz früh aus, genau an der Stelle, an der die Annahme falsch ist, statt weit entfernt davon.
Der Vorteil: Der Prüfer zwingt dich, jeden Wert, der „möglicherweise fehlt“, schon während der Bearbeitung zu behandeln, und der Laufzeitfehler tritt schlicht nie auf.
Aufgabe
EinfachGib einen Namen an, für den möglicherweise ein sicherer Ersatzwert fehlt.
- Lass
--!strictin der ersten Zeile stehen. - Schreibe
local function getDisplayName(fullName: string?): string, dasfullNamezurückgibt, wenn es nichtnilist, andernfalls"Anonymous User". - Gib
getDisplayName("John Smith")undgetDisplayName(nil)aus.
Klicke auf „Code ausführen“: Die Ausgabe zeigt John Smith und Anonymous User.
Probier es selbst
--!strict
-- 1) getDisplayName(fullName: string?): string, mit Rückgriff auf "Anonymous User"
-- 2) Gib es für "John Smith" und nil aus
Alle Lektionen in Einführung in Luau
1Erste Schritte mit Luau
Was ist Luau?Warum Luau nutzen?Dein erster Luau-CodeTypprüfung & FehlermodiZusammenfassung: Einführung in Luau4Mit Funktionen arbeiten
Parameter und Rückgabewerte typisierenAnonyme Funktionen typisierenFunktionen ohne RückgabewertOptionale ParameterStandardwerte für ParameterStandardwerte für boolesche WerteFunktionen mit variabler ParameteranzahlFunktionstypen definierenRückblick: typisierte Funktionen7Projekt: Typisierter Aufgabenmanager
Projekt: Die AufgabenstrukturFunktion zum Hinzufügen einer Aufgabe2Grundlegende Typen
Zahl, String und BooleanDer Typ „any“: NotausgangDer Typ „unknown“Nil- und optionale TypenTypinferenz in der PraxisExplizite TypannotationenRückblick: Übung zu grundlegenden Typen5Typ-Aliase, Union-Typen und Schnittmengen-Typen
Typ-Aliase für PrimitivenUnion-TypenArbeiten mit Union-TypenLiterale TypenSchnittmengen-Typen (Intersection Types)Kombination von Typ-AliasenZusammenfassung: Fortgeschrittene Typ-Kombinationen8Enums auf die Luau-Art
Das Enum-Pattern in LuauNumerische Enums mit TablesString-Enums als UnionsVerwendung von Literal Union EnumsKonstante Tables einfrierenZusammenfassung: Enums auf die Luau-Art11Fortgeschrittene Themen
TypzusicherungenTypwächter mit typeofDer never-TypNull-Sicherheit im Strict-ModusIndexsignaturenRückblick: Typen von KonfigurationswertenRückblick: Typen feinabstimmen3Typisierte Tabellen: Arrays & Maps
Typisierte ArraysElemente hinzufügen und auslesenWas ist ein Map-Typ?Maps deklarieren und auf Elemente zugreifenTabellen durchlaufenTabellen mit gemischten FormenEin Raster auslesenEin Raster erstellentable.unpackRückblick: Arrays und MapsÜbe selbstständig: Online-Luau-Compiler