Menu
Coddy logo textTech

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 Modus

Diese 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"
end

Wenn 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.

challenge icon

Aufgabe

Einfach

Verarbeite Benutzerprofilfelder, die möglicherweise fehlen. Beginne deine Datei mit --!strict.

  • getDisplayName(fullName: string?): string — gibt fullName zurück, wenn es nicht nil ist, andernfalls "Anonymous User".
  • formatEmail(email: string?): string — gibt die E-Mail in Kleinbuchstaben zurück (string.lower), wenn sie nicht nil ist, andernfalls "No email provided".
  • getUserInfo(name: string?, email: string?): string — verwendet beide Funktionen und gibt Name: [processed name], Email: [processed email] zurück.

Gib dann folgendes aus, jeweils in einer eigenen Zeile:

  1. getDisplayName("John Smith")
  2. getDisplayName(nil)
  3. formatEmail("ALICE@EXAMPLE.COM")
  4. formatEmail(nil)
  5. getUserInfo("Bob Johnson", "bob@test.com")
  6. getUserInfo(nil, nil)
  7. 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
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