Menu
Coddy logo textTech

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 tabela

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

Chociaż 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.

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. Liczbę punktów bonusowych 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, 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)
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