Menu
Coddy logo textTech

Bezpieczeństwo wartości nil w trybie ścisłym

Część sekcji Wprowadzenie do Luau ścieżki Lua w Coddy. Lekcja 71 z 73.

Najczęstszym powodem awarii w Lua jest „attempt to index nil”: kod zakładał, że wartość istnieje, choć tak nie było. Odpowiedzią Luau jest dyscyplina nil: przy --!strict zwykły string nigdy nie może być nil. Jeśli nil jest realną możliwością, typ musi to zaznaczać za pomocą ?:

--!strict
local nickname: string? = nil   -- ok: string OR nil
local username: string = nil    -- ✗ błąd typu w trybie strict

Dyscyplina działa w obie strony: jeśli masz wartość typu string?, tryb ścisły nie pozwoli ci użyć jej jako ciągu znaków, dopóki nie wykluczysz nil. Standardowym narzędziem jest zwykłe porównanie, które zawęża typ tak samo jak strażnik typeof:

local function shout(name: string?): string
    if name ~= nil then
        return string.upper(name) -- name jest tutaj typu string
    end
    return "NOBODY"
end

Gdy nil oznaczałoby błąd, a nie prawidłowy przypadek, użyj assert: po assert(x ~= nil) weryfikator traktuje x jako niebędące nil do końca zakresu, a w czasie działania assert powoduje awarię od razu, w miejscu błędnego założenia, zamiast gdzieś daleko stąd.

Korzyść: weryfikator wymusza obsłużenie każdej wartości, której „może brakować”, już podczas edycji, a błąd czasu działania po prostu nigdy się nie pojawia.

challenge icon

Wyzwanie

Łatwy

Obsłuż pola profilu użytkownika, których może brakować. Rozpocznij plik od --!strict.

  • getDisplayName(fullName: string?): string: zwraca fullName, jeśli nie jest równe nil, w przeciwnym razie Anonymous User.
  • formatEmail(email: string?): string: zwraca adres e-mail zapisany małymi literami (string.lower), jeśli nie jest równy nil, w przeciwnym razie No email provided.
  • getUserInfo(name: string?, email: string?): string: używa obu funkcji i zwraca Name: [processed name], Email: [processed email].

Następnie wypisz, każdy wynik w osobnym wierszu:

  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)

Spróbuj swoich sił

--!strict
-- Napisz kod tutaj
-- 1) getDisplayName(fullName: string?): string — sprawdź, czy wartość to nil; w przeciwnym razie użyj wartości domyślnej "Anonymous User"
-- 2) formatEmail(email: string?): string — string.lower lub "No email provided"
-- 3) getUserInfo(name: string?, email: string?): string — połącz obie wartości
-- 4) wypisz siedem wywołań testowych z zadania
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Wprowadzenie do Luau

Poćwicz samodzielnie: Kompilator Luau online