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 strictTa 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"
endGdy 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.
Wyzwanie
ŁatwyPodaj imię, dla którego może brakować bezpiecznej wartości zastępczej.
- Pozostaw
--!strictw pierwszym wierszu. - Napisz
local function getDisplayName(fullName: string?): string, która zwracafullName, gdy nie jest równenil, a w przeciwnym razie"Anonymous User". - Wypisz
getDisplayName("John Smith")orazgetDisplayName(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
1Pierwsze kroki z Luau
Czym jest Luau?Dlaczego warto używać Luau?Twój pierwszy kod w LuauSprawdzanie typów i tryby błędówPodsumowanie: Wprowadzenie do Luau4Praca z funkcjami
Typowanie parametrów i wartości zwracanychTypowanie funkcji anonimowychFunkcje niezwracające wartościParametry opcjonalneDomyślne wartości parametrówWartości domyślne dla typów BooleanFunkcje wariadyczneDefiniowanie typów funkcjiPodsumowanie: funkcje z typami2Podstawowe typy
Number, String i BooleanTyp 'any': wyjście awaryjneTyp 'unknown'Nil i typy opcjonalneInferencja typów w praktyceJawne adnotacje typówPowtórka: ćwiczenia z podstawowych typów5Aliasy, typy sumy i przekroju
Aliasy typów dla typów prostychTypy sumyPraca z typami sumyTypy literałoweTypy przekrojuŁączenie aliasów typówPodsumowanie: zaawansowane kombinacje typów8Enumy po luauowemu
Wzorzec enumów w LuauNumeryczne enumy z tabelamiEnumy tekstowe jako unieUżywanie enumów opartych na unii literałówZamrażanie stałych tabelPodsumowanie: enumy po luauowemu11Zaawansowane zagadnienia
Asercje typówStrażnicy typów z typeofTyp neverBezpieczeństwo wartości nil w trybie ścisłymSygnatury indeksówPowtórka: typy wartości konfiguracjiPowtórka: dostrajanie typów3Typowane tabele: tablice i mapy
Typowane tabliceDodawanie i odczytywanie elementówCzym jest typ mapy?Deklarowanie i uzyskiwanie dostępu do mapIterowanie po tabelachTabele o mieszanej strukturzeOdczytywanie siatkiTworzenie siatkitable.unpackPodsumowanie: tablice i mapyPoćwicz samodzielnie: Kompilator Luau online