Kropka czy dwukropek
Część sekcji Programowanie obiektowe ścieżki Lua w Coddy. Lekcja 4 z 70.
Teraz, gdy znasz już składnię z kropką i dwukropkiem, zobacz, jak są ze sobą powiązane i co się dzieje, gdy tabela nie zostanie przekazana.
Oba dwukropki to skrócony zapis. Zdefiniowanie function game:addPoints(points) jest tym samym co zdefiniowanie function game.addPoints(self, points), a wywołanie game:addPoints(10) jest tym samym co wywołanie game.addPoints(game, 10). Metoda działa, o ile tabela jest przekazywana jako jej pierwszy argument.
Oto, co się dzieje, gdy tablica nie zostanie przekazana:
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, a self.score kończy się błędem, ponieważ 10 jest liczbą, a nie tabelą.
Funkcja zdefiniowana z kropką i jawnym argumentem self działa przy wywołaniu z dwukropkiem, ponieważ dwukropek przekazuje tabelę jako pierwszy argument:
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łaObie definicje tworzą tę samą funkcję, więc wybór jest kwestią konwencji: używaj dwukropka do definiowania i wywoływania funkcji, które działają na self, a kropki w przypadku funkcji, które nie używają self. Wtedy każde wywołanie pokazuje, czy tabela jest przekazywana.
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
- Wartość bonusu 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 jej zdefiniowania.
Spróbuj swoich sił
-- Odczytaj 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 jawnie podając 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
-- Wyświetl 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