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 strictDyscyplina 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"
endGdy 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.
Wyzwanie
ŁatwyObsłuż pola profilu użytkownika, których może brakować. Rozpocznij plik od --!strict.
getDisplayName(fullName: string?): string: zwracafullName, jeśli nie jest równenil, w przeciwnym razieAnonymous User.formatEmail(email: string?): string: zwraca adres e-mail zapisany małymi literami (string.lower), jeśli nie jest równynil, w przeciwnym razieNo email provided.getUserInfo(name: string?, email: string?): string: używa obu funkcji i zwracaName: [processed name], Email: [processed email].
Następnie wypisz, każdy wynik w osobnym wierszu:
getDisplayName("John Smith")getDisplayName(nil)formatEmail("ALICE@EXAMPLE.COM")formatEmail(nil)getUserInfo("Bob Johnson", "bob@test.com")getUserInfo(nil, nil)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
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
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 niczego nie zwracająceParametry opcjonalneDomyślne wartości parametrówFunkcje wariadyczneDefiniowanie typów funkcjiPodsumowanie: funkcje z typami2Typy podstawowe
Typy podstawowe: num, str, boolTyp „any”: furtka awaryjnaTyp „unknown”Typy Nil i opcjonalneInferencja typów w praktyceJawne adnotacje typówPowtórka: ćwiczenie typów podstawowych5Aliasy, 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żniki typów z typeofTyp neverBezpieczeństwo wartości nil w trybie ścisłymSygnatury indeksowePodsumowanie: precyzyjne dostrajanie typów3Typowane tabele: tablice i mapy
Tablice typowaneDodawanie i odczytywanie elementówCzym jest typ mapy?Deklarowanie map i dostęp do nichIterowanie po tabelachTabele o mieszanej strukturzeWielowymiarowe tablice typowanetable.unpack i varargsPodsumowanie: tablice i mapyPoćwicz samodzielnie: Kompilator Luau online