Self i metody z dwukropkiem
Część sekcji Wprowadzenie do Luau ścieżki Lua w Coddy. Lekcja 45 z 80.
Zapis rect.area(rect) działa, ale w lekcji o OOP w Lua poznano lepszy sposób: dwukropek. rect:area() to dokładnie to samo wywołanie: Lua automatycznie przekazuje tabelę sprzed dwukropka jako pierwszy argument, self.
Dwukropek pomaga również przy definiowaniu. function account:deposit(amount) deklaruje za ciebie ukryty pierwszy parametr o nazwie self:
type Account = {
owner: string,
balance: number,
deposit: (self: Account, amount: number) -> (),
getBalance: (self: Account) -> number,
}
local account = {owner = "Maya", balance = 1500}
function account:deposit(amount: number)
self.balance += amount -- self jest niejawne
end
function account:getBalance(): number
return self.balance
endZwróć uwagę, że typ jawnie deklaruje self: deposit: (self: Account, amount: number) -> (), mimo że w implementacji dwukropek go ukrywa. Dwukropek to tylko skrót; parametr nadal istnieje, a typ go wyszczególnia. Metodę, która niczego nie zwraca, zapisuje się z pustym typem zwracanym -> ().
Wywołanie działa zgodnie z tą samą znaną ci już zasadą: account:deposit(250) jest identyczne z account.deposit(account, 250). Zachowanie w czasie działania jest takie samo jak w rozdziale o OOP: Luau po prostu dodaje typy.
Zwróć uwagę, że sama zmienna account nie ma adnotacji typu. Typ Account opisuje gotową tabelę, a tabela pasuje do niego dopiero po dodaniu obu metod; zapis local account: Account = {owner = "Maya", balance = 1500} sprawiłby, że tryb ścisły zgłosiłby brakujące metody.
Wyzwanie
ŁatwyPrzypisz dwa metody do konta, używając składni z dwukropkiem.
- Pod tabelą zdefiniuj
function account:deposit(amount: number), która dodajeamountdoself.balance. - Zdefiniuj
function account:getBalance(): number, która zwracaself.balance. - Wypisz
account:getBalance(), wywołajaccount:deposit(120), a następnie ponownie wypiszaccount:getBalance().
Naciśnij Uruchom kod: wynik to 300, a następnie 420.
Spróbuj swoich sił
type Account = {
owner: string,
balance: number,
deposit: (self: Account, amount: number) -> (),
getBalance: (self: Account) -> number,
}
local account = {owner = "Noah", balance = 300}
-- 1) function account:deposit(amount: number)
-- 2) function account:getBalance(): number
-- 3) wyświetl saldo, wpłać 120, a następnie ponownie wyświetl saldo
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 tabelPoćwicz samodzielnie: Kompilator Luau online