Kropka czy dwukropek
Część sekcji Programowanie obiektowe ścieżki Lua w Coddy. Lekcja 4 z 70.
Skoro znasz już składnię kropkową i dwukropkową, koniecznie dowiedz się, kiedy stosować każdą z nich i co się dzieje, gdy użyjesz ich nieprawidłowo.
Kluczowa zasada jest prosta: sposób definiowania funkcji musi odpowiadać sposobowi jej wywoływania. Jeśli definiujesz ją za pomocą dwukropka, wywołuj ją za pomocą dwukropka. Jeśli definiujesz ją za pomocą kropki i jawnego self, wywołuj ją za pomocą kropki i przekaż tabelę.
Oto, co się dzieje, gdy je pomylisz:
local game = { score = 0 }
function game:addPoints(points)
self.score = self.score + points
end
-- BŁĄD: wywołanie z kropką, ale bez przekazania tabeli
game.addPoints(10) -- Błąd! self to teraz 10, a nie tabelaGdy wywołujesz game.addPoints(10), Lua nie przekazuje automatycznie game. Wartość 10 staje się self, co powoduje nieoczekiwane zachowanie lub błędy.
Kierunek odwrotny jest bardziej wyrozumiały:
function game.reset(self)
self.score = 0
end
-- Wywołanie z dwukropkiem: game:reset() jest równoważne game.reset(game)
game:reset() -- self poprawnie otrzymuje game, więc to działaChociaż ten konkretny przypadek może działać, powoduje zamieszanie i może zakłócać działanie funkcji, które oczekują określonych argumentów. Najbezpieczniej jest zachować spójność: używaj dwukropka zarówno przy definiowaniu, jak i wywoływaniu funkcji, gdy funkcja wymaga self, a kropki, gdy go nie wymaga.
Wyzwanie
ŁatwyUtwórz tabelę o nazwie player z polem score zainicjalizowanym wartością 0.
Dodaj do tabeli dwie funkcje:
player.setScore(self, value)— zdefiniowaną za pomocą składni z kropką i jawnym parametremself. Ustawiaself.scorena podaną wartość.player:addBonus(amount)— zdefiniowaną za pomocą składni z dwukropkiem. Dodajeamountdoself.score.
Otrzymasz dwa dane wejściowe:
- Początkową wartość wyniku
- Liczbę punktów bonusowych do dodania
Wykonaj następujące kroki:
- Wywołaj
setScoreza pomocą składni z kropką (przekazując tabelę jako pierwszy argument), aby ustawić początkowy wynik - Wywołaj
addBonusza pomocą składni z dwukropkiem, aby dodać bonus - Wypisz końcową wartość
player.score
Pamiętaj: sposób wywołania każdej funkcji musi odpowiadać sposobowi, w jaki została zdefiniowana.
Spróbuj swoich sił
-- Wczytaj dane wejściowe
local initialScore = tonumber(io.read())
local bonusAmount = tonumber(io.read())
-- TODO: Napisz swój kod poniżej
-- 1. Utwórz tabelę o nazwie 'player' z polem 'score' zainicjalizowanym wartością 0
-- 2. Dodaj player.setScore(self, value), używając składni z kropką i jawnego parametru self
-- 3. Dodaj player:addBonus(amount), używając składni z dwukropkiem
-- 4. Wywołaj setScore, używając składni z kropką (przekazując tabelę jako pierwszy argument)
-- 5. Wywołaj addBonus, używając składni z dwukropkiem
-- Wypisz końcowy wynik
print(player.score)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