Menu
CoddyTech

Metametoda __index

Część sekcji Logika i przepływ programu ścieżki Lua w Coddy. Lekcja 18 z 54.

Skoro wiesz już, jak przypisywać metatabele do tabel, pora poznać najważniejszą metametodę: __index. Ta metametoda określa, co się dzieje, gdy próbujesz uzyskać dostęp do klucza, który nie istnieje w tabeli.

Zwykle, gdy szukasz klucza, którego nie ma w tabeli, Lua zwraca nil. Jeśli jednak tabela ma metatabelę z polem __index, Lua sprawdzi zamiast tego to pole. Jeśli __index wskazuje na inną tabelę, Lua poszuka tam klucza:

local defaults = {
    health = 100,
    speed = 10
}

local player = {name = "Alice"}
local meta = {__index = defaults}

setmetatable(player, meta)

print(player.name)    -- Wynik: Alice
print(player.health)  -- Wynik: 100

W tym przykładzie player ma tylko klucz name. Gdy uzyskujesz dostęp do player.health, Lua nie znajduje go w player, więc sprawdza pole __index metatabeli. Ponieważ __index wskazuje na tabelę defaults, Lua sprawdza ją i znajduje health = 100.

Tworzy to mechanizm awaryjny, w którym jedna tablica może dostarczać wartości domyślne dla innej. Oryginalna tablica zachowuje własne wartości, ale brakujące klucze są automatycznie wyszukiwane w tablicy awaryjnej.

__index może być również funkcją. Gdy brakuje klucza, Lua wywołuje ją z tabelą i kluczem, a następnie używa wartości, którą zwróci:

local scores = {alice = 12}

setmetatable(scores, {
    __index = function(t, key)
        return 0  -- każda brakująca nazwa liczy się jako 0
    end
})

print(scores.alice)  -- Wynik: 12
print(scores.bob)    -- Wynik: 0

Tabela zapewnia stałe wartości zastępcze; funkcja może obliczyć wartość dla dowolnego brakującego klucza.

challenge icon

Wyzwanie

Łatwy

Napisz funkcję createCharacterWithDefaults, która przyjmuje name i level oraz zwraca tabelę postaci z domyślnymi wartościami statystyk.

Utwórz tabelę postaci z podaną nazwą i poziomem. Użyj metatabeli z __index, aby zapewnić domyślne wartości dla brakujących statystyk (health, mana, strength).

Logika:

  • Utwórz tabelę wartości domyślnych z kluczami: health = 100, mana = 50, strength = 10
  • Utwórz tabelę postaci z kluczami: name (podana nazwa) i level (podany poziom)
  • Utwórz metatabelę z __index wskazującym na tabelę wartości domyślnych
  • Dołącz metatabelę do tabeli postaci za pomocą setmetatable()
  • Zwróć tabelę postaci

Parametry:

  • name (ciąg znaków): Imię postaci
  • level (liczba): Poziom postaci

Zwraca: Tabelę postaci z imieniem, poziomem i domyślnymi statystykami dostępnymi za pośrednictwem metatabeli (tabela)

Spróbuj swoich sił

function createCharacterWithDefaults(name, level)
    -- Wpisz tutaj kod
end
quiz iconSprawdź się

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

Wszystkie lekcje w sekcji Logika i przepływ programu

Poćwicz samodzielnie: Kompilator Lua online