Problem, który rozwiązują typy generyczne
Część sekcji Wprowadzenie do Luau ścieżki Lua w Coddy. Lekcja 61 z 80.
Wyobraź sobie, że potrzebujesz funkcji, która po prostu zwraca dowolną przekazaną jej wartość: funkcji tożsamościowej. Przy typach, które znasz do tej pory, masz dwie możliwości i obie są kiepskie.
Opcja pierwsza: napisać osobną kopię dla każdego typu. Treści funkcji są identyczne; różnią się tylko adnotacje:
local function echoNumber(value: number): number
return value
end
local function echoString(value: string): string
return value
endKażdy nowy typ oznacza kolejną kopię, a błąd poprawiony w jednej trzeba poprawić we wszystkich. To właśnie duplikowania chcesz uniknąć, pisząc funkcje.
Opcja druga: połączyć je w jedną funkcję z typem any:
local function echo(value: any): any
return value
endTeraz jedna funkcja obsługuje wszystko, ale ceną jest bezpieczeństwo typów. Gdy wywołujesz echo("hello"), moduł sprawdzający nie wie już, że wynikiem jest ciąg znaków. Zna tylko any, więc autouzupełnianie przestaje działać, a błędy typów umykają: gubi się powiązanie między tym, co zostało przekazane, a tym, co jest zwracane.
Tak naprawdę potrzebujesz funkcji, która działa dla każdego typu i pamięta, którego typu użyto przy każdym wywołaniu. Właśnie to zapewniają typy generyczne — i o nich jest ten rozdział.
Wyzwanie
ŁatwyZobacz, o czym zapomina wersja any funkcji echo.
- Napisz
local function echo(value: any): any, która zwracavalue. - Zapisz
echo("hello")wlocal result. - Wypisz
result, a następnietypeof(result).
Naciśnij Run Code: wynik pokazuje hello i string.
Spróbuj swoich sił
-- 1) echo(value: any): any
-- 2) local result = echo("hello")
-- 3) wypisz result i typeof(result)
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ó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 mapy6Typowanie kształtów tabel
Adnotacje kształtów w miejscuAliasy typów dla kształtówWłaściwości opcjonalneKształty a luźne tabeleRozszerzanie kształtówDodawanie metod do kształtówSelf i metody z dwukropkiemPodsumowanie: definiowanie kształtów tabel9Typy generyczne: pierwsze spojrzenie
Problem, który rozwiązują typy generyczneGeneryczna funkcja identycznościowaKorzystanie z funkcji generycznejTablice generyczneGeneryczne aliasy typówPodsumowanie: funkcje generycznePoćwicz samodzielnie: Kompilator Luau online