Menu
CoddyTech

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 tabela

Gdy 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ła

Obie 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.

challenge icon

Wyzwanie

Łatwy

Utwórz tabelę o nazwie player z polem score zainicjalizowanym wartością 0.

Dodaj do tabeli dwie funkcje:

  1. player.setScore(self, value) — zdefiniowaną za pomocą składni z kropką i jawnym parametrem self. Ustawia self.score na podaną wartość.
  2. player:addBonus(amount) — zdefiniowaną za pomocą składni z dwukropkiem. Dodaje amount do self.score.

Otrzymasz dwa dane wejściowe:

  1. Początkową wartość wyniku
  2. Wartość bonusu do dodania

Wykonaj następujące kroki:

  1. Wywołaj setScore za pomocą składni z kropką (przekazując tabelę jako pierwszy argument), aby ustawić początkowy wynik
  2. Wywołaj addBonus za pomocą składni z dwukropkiem, aby dodać bonus
  3. 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)
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Lua online