Nil-Sicherheit im Strict Mode
Teil des Abschnitts Einführung in Luau der Lua-Journey von Coddy — Lektion 71 von 73.
Der häufigste Lua-Absturz ist "attempt to index nil" — Code, der davon ausging, dass ein Wert existiert, obwohl dies nicht der Fall war. Luaus Antwort darauf ist nil-Disziplin: Unter --!strict kann ein einfaches string niemals nil sein. Wenn nil eine echte Möglichkeit ist, muss der Typ dies mit ? angeben:
--!strikt
local nickname: string? = nil -- ok: string ODER nil
local username: string = nil -- ✗ Typfehler im strikten ModusDiese Disziplin gilt in beide Richtungen: Bei einem string? lässt der Strict-Modus die Verwendung als String erst zu, nachdem Sie nil ausgeschlossen haben. Das Standardwerkzeug ist ein einfacher Vergleich, der den Typ genauso verfeinert wie ein typeof-Guard:
local function shout(name: string?): string
if name ~= nil then
return string.upper(name) -- name ist hier string
end
return "NOBODY"
endWenn nil eher ein Bug als ein gültiger Fall wäre, verwenden Sie assert: Nach assert(x ~= nil) behandelt der Typchecker x für den Rest des Gültigkeitsbereichs als Nicht-Nil — und zur Laufzeit stürzt der Assert frühzeitig ab, genau am Punkt der falschen Annahme, anstatt irgendwo weit entfernt.
Der Vorteil: Der Typchecker zwingt Sie dazu, jeden Wert, der "fehlen könnte", bereits beim Editieren zu behandeln, sodass der Laufzeitfehler gar nicht erst auftritt.
Aufgabe
EinfachVerarbeite Benutzerprofilfelder, die möglicherweise fehlen. Beginne deine Datei mit --!strict.
getDisplayName(fullName: string?): string— gibtfullNamezurück, wenn es nichtnilist, andernfalls"Anonymous User".formatEmail(email: string?): string— gibt die E-Mail in Kleinbuchstaben zurück (string.lower), wenn sie nichtnilist, andernfalls"No email provided".getUserInfo(name: string?, email: string?): string— verwendet beide Funktionen und gibtName: [processed name], Email: [processed email]zurück.
Gib dann folgendes aus, jeweils in einer eigenen Zeile:
getDisplayName("John Smith")getDisplayName(nil)formatEmail("ALICE@EXAMPLE.COM")formatEmail(nil)getUserInfo("Bob Johnson", "bob@test.com")getUserInfo(nil, nil)getUserInfo("Sarah Wilson", nil)
Probier es selbst
--!strict
-- Schreibe Code hier
-- 1) getDisplayName(fullName: string?): string — nil-check, fallback "Anonymous User"
-- 2) formatEmail(email: string?): string — string.lower or "No email provided"
-- 3) getUserInfo(name: string?, email: string?): string — beide kombinieren
-- 4) gib die sieben Testaufrufe aus der Aufgabe aus
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
1Erste Schritte mit Luau
Was ist Luau?Warum Luau nutzen?Dein erster Luau-CodeTypprüfung & FehlermodiZusammenfassung: Einführung in Luau4Arbeiten mit Funktionen
Typisierung von Parametern & RückgabewertenTypisierung von anonymen FunktionenFunktionen ohne RückgabewertOptionale ParameterStandard-ParameterwerteVariadische FunktionenDefinieren von FunktionstypenZusammenfassung: Typisierte Funktionen2Grundtypen
Grundlegende Typen: num, str, boolDer Typ 'any': Der AuswegDer Typ 'unknown'Nil- & optionale TypenTypinferenz in der PraxisExplizite TypannotationenZusammenfassung: Praxis zu Grundtypen5Typ-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
Typzusicherungen (Type Assertions)Type Guards mit typeofDer Typ neverNil-Sicherheit im Strict ModeIndex-SignaturenZusammenfassung: Feineinstellung von Typen3Typisierte Tabellen: Arrays & Maps
Typisierte ArraysHinzufügen und Lesen von ElementenWas ist ein Map-Typ?Deklarieren und Zugreifen auf MapsIterieren von TabellenGemischt-strukturierte TabellenMehrdimensionale typisierte Arraystable.unpack und VarargsZusammenfassung: Arrays und Maps