Menu
CoddyTech

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

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

Najczęstszym błędem powodującym awarię w Lua jest „attempt to index nil”: kod, który zakładał, że wartość istnieje, choć tak nie było. Odpowiedzią Luau jest dyscyplina nil: przy --!strict zwykły typ string nigdy nie może mieć wartości nil. Jeśli nil jest realną możliwością, typ musi to określać za pomocą ?:

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

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

local function shout(name: string?): string
    if name ~= nil then
        return string.upper(name) -- name jest tutaj ciągiem znaków
    end
    return "NOBODY"
end

Gdy nil oznaczałoby błąd, a nie prawidłowy przypadek, użyj assert: po assert(x ~= nil) kontroler typów traktuje x jako wartość inną niż nil do końca bieżącego zakresu, a podczas działania programu asercja powoduje awarię od razu, w miejscu błędnego założenia, zamiast gdzieś daleko stąd.

Korzyść jest taka, że kontroler typów wymusza obsłużenie każdej wartości, której „może brakować”, już podczas edycji kodu, a błąd wykonania po prostu nigdy się nie pojawia.

challenge icon

Wyzwanie

Łatwy

Podaj imię, dla którego może brakować bezpiecznej wartości zastępczej.

  1. Pozostaw --!strict w pierwszym wierszu.
  2. Napisz local function getDisplayName(fullName: string?): string, która zwraca fullName, gdy nie jest równe nil, a w przeciwnym razie "Anonymous User".
  3. Wypisz getDisplayName("John Smith") oraz getDisplayName(nil).

Naciśnij Run Code: wynik pokazuje John Smith i Anonymous User.

Spróbuj swoich sił

--!strict
-- 1) getDisplayName(fullName: string?): string, używając "Anonymous User" jako wartości domyślnej
-- 2) wypisz wynik dla "John Smith" i nil

Wszystkie lekcje w sekcji Wprowadzenie do Luau

Poćwicz samodzielnie: Kompilator Luau online