Menu
Coddy logo textTech

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: 1

Zwróć 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: 0

Ręczne przekazywanie tablicy działa, ale może wydawać się powtarzalne. W następnej lekcji poznasz czytelniejszą składnię, która robi to automatycznie.

challenge icon

Wyzwanie

Łatwy

Utwó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 amount jako drugi parametr
  • Dodaje amount do self.count

Otrzymasz dwa wejścia:

  1. Pierwsza wartość do dodania
  2. 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)
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