Jawne „self”
Część sekcji Programowanie obiektowe ścieżki Lua w Coddy. Lekcja 2 z 70.
Gdy funkcja znajduje się wewnątrz tabeli, często musi uzyskiwać dostęp do danych w tej samej tabeli lub je modyfikować. Ale pojawia się problem: skąd funkcja wie, do której tabeli należy?
Rozwiązaniem jest jawne przekazanie tablicy jako pierwszego argumentu funkcji. Zgodnie z konwencją ten parametr nazywa się self:
local counter = {
value = 0
}
function counter.increment(self)
self.value = self.value + 1
end
counter.increment(counter)
print(counter.value) -- Wynik: 1Zwróć uwagę, że wywołujemy counter.increment(counter), przekazując samą tablicę jako argument. Wewnątrz funkcji self odnosi się teraz do tej tablicy, co pozwala nam odczytywać i modyfikować self.value.
Ten wzorzec jest niezbędny, ponieważ pozwala funkcji pracować z danymi tablicy bez wpisywania na stałe jej nazwy. Rozważ funkcję, która resetuje i zwraca bieżący licznik:
function counter.reset(self)
local old = self.value
self.value = 0
return old
end
print(counter.reset(counter)) -- Wynik: 1
print(counter.value) -- Wynik: 0Ręczne przekazywanie tablicy działa, ale może wydawać się powtarzalne. W następnej lekcji poznasz czytelniejszą składnię, która robi to automatycznie.
Wyzwanie
ŁatwyUtwórz tabelę o nazwie tracker z polem count zainicjalizowanym wartością 0.
Dodaj funkcję tracker.addAmount(self, amount), która:
- Przyjmuje
self(tabelę) jako pierwszy parametr - Przyjmuje
amountjako drugi parametr - Dodaje
amountdoself.count
Otrzymasz dwa wejścia:
- Pierwsza wartość do dodania
- Druga wartość do dodania
Wywołaj tracker.addAmount dwa razy (po jednym razie dla każdego wejścia), za każdym razem przekazując tabelę jako pierwszy argument. Po obu wywołaniach wypisz końcową wartość tracker.count.
Spróbuj swoich sił
-- Wczytaj dane wejściowe
local amount1 = tonumber(io.read())
local amount2 = tonumber(io.read())
-- TODO: Napisz swój kod poniżej
-- Utwórz tabelę o nazwie 'tracker' z polem 'count' zainicjalizowanym wartością 0
-- Dodaj funkcję tracker.addAmount(self, amount), która dodaje amount do self.count
-- Wywołaj tracker.addAmount dwa razy, przekazując tabelę jako pierwszy argument
-- Wypisz końcową wartość count
print(tracker.count)Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Programowanie obiektowe
1Koncepcja „self”
Tabele z funkcjamiJawne „self”Składnia z dwukropkiemKropka czy dwukropekPodsumowanie — poruszający się punkt4Projekt: Bank cyfrowy
Konfiguracja projektuMetoda wpłaty7Polimorfizm i nadpisywanie
Nadpisywanie metodWywoływanie metod klasy nadrzędnejTypowanie kaczeWspólny interfejsSprawdzanie typuPodsumowanie — role pracowników10Projekt: Menedżer kształtów
Konfiguracja projektuKlasa prostokątaKlasa kołaMetoda obwoduKolekcja kształtówPole całkowiteFiltrowanie kształtów2Wzorzec prototypu klasy
Koncepcja prototypuŁączenie za pomocą __indexKonstruktor :new()Inicjalizacja atrybutówNiezależne instancjePodsumowanie – fabryka samochodów5Przeciążanie operatorów w OOP
Dodawanie obiektówOdejmowanie obiektówŁączenie obiektówPorównywanie obiektów (<, >)Powtórka — działania na portfelu8Hermetyzacja
Konwencje nazewnictwaDomknięcia dla prywatnościDostęp za pomocą domknięćTabele tylko do odczytuLogika walidacjiPodsumowanie — bezpieczny sejf11Wzorce projektowe (podstawy)
Funkcje fabrykująceTabela SingletonWzorzec iteratoraObserwator (nasłuchujący)Powtórka — fabryka loggera3Stan i zachowanie obiektu
Zmienne instancjiMetody dostępoweMetody ustawiająceWłaściwości obliczaneFormatowanie ciągów znakówSprawdzanie równościPodsumowanie – ocena ucznia6Podstawy dziedziczenia
Konfiguracja dziedziczeniaDziedziczenie metodRozszerzanie konstruktoraDodawanie metod potomnychWspólne i unikalne elementyPowtórka — hierarchia kształtówPoćwicz samodzielnie: Kompilator Lua online