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: 100W 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.
Wyzwanie
ŁatwyNapisz 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ę) ilevel(podany poziom) - Utwórz metatabelę z
__indexwskazują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ę postacilevel(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
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
1Zaawansowane iterowanie po tabelach
Iterowanie za pomocą pairs()Iterowanie za pomocą ipairs()pairs() a ipairs()Powtórka — karta postaci2Więcej funkcji biblioteki table
table.concat()Tworzenie tabel i unpack()table.sort()Sortowanie niestandardowe za pomocą funkcjiPodsumowanie — tablica najlepszych wyników5Projekt: silnik tekstowej gry przygodowej
Konfiguracja projektu: pokójŁączenie pokoiPoćwicz samodzielnie: Kompilator Lua online