Menu
CoddyTech

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
end

Zwróć 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.

challenge icon

Wyzwanie

Łatwy

Przypisz dwa metody do konta, używając składni z dwukropkiem.

  1. Pod tabelą zdefiniuj function account:deposit(amount: number), która dodaje amount do self.balance.
  2. Zdefiniuj function account:getBalance(): number, która zwraca self.balance.
  3. Wypisz account:getBalance(), wywołaj account:deposit(120), a następnie ponownie wypisz account: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

Poćwicz samodzielnie: Kompilator Luau online