Menu
Coddy logo textTech

Metametoda __index

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

Teraz, gdy wiesz już, jak dołączać metatabele do tabel, czas 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.

Zazwyczaj, 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 szuka tam 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.

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 podanym imieniem i poziomem. Użyj metatabeli z __index, aby zapewnić domyślne wartości dla brakujących statystyk (zdrowie, mana, siła).

Logika:

  • Utwórz tabelę domyślnych wartości z kluczami: health = 100, mana = 50, strength = 10
  • Utwórz tabelę postaci z kluczami: name (podane imię) i level (podany poziom)
  • Utwórz metatabelę z __index wskazującym na tabelę domyślnych wartości
  • 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)
    -- Napisz kod tutaj
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