Metamethod __index
Termasuk bagian Logika dan Alur dalam perjalanan Lua di Coddy. Pelajaran 18 dari 54.
Sekarang kamu sudah tahu cara memasang metatable ke tabel, saatnya mempelajari metamethod yang paling penting: __index. Metamethod ini mengatur apa yang terjadi saat kamu mencoba mengakses key yang tidak ada di dalam tabel.
Biasanya, saat kamu mencari key yang tidak ada dalam tabel, Lua mengembalikan nil. Namun, jika tabel memiliki metatable dengan field __index, Lua akan memeriksa field tersebut. Jika __index menunjuk ke tabel lain, Lua akan mencari key di sana:
local defaults = {
health = 100,
speed = 10
}
local player = {name = "Alice"}
local meta = {__index = defaults}
setmetatable(player, meta)
print(player.name) -- output: Alice
print(player.health) -- output: 100Dalam contoh ini, player hanya memiliki kunci name. Saat kamu mengakses player.health, Lua tidak menemukannya di player, jadi Lua memeriksa field __index pada metatable. Karena __index menunjuk ke tabel defaults, Lua mencarinya di sana dan menemukan health = 100.
Ini membuat mekanisme cadangan, sehingga satu tabel dapat menyediakan nilai default untuk tabel lain. Tabel asli tetap menyimpan nilainya sendiri, tetapi setiap kunci yang tidak ada akan dicari secara otomatis di tabel cadangan.
Tantangan
MudahTulis fungsi createCharacterWithDefaults yang menerima name dan level, lalu mengembalikan tabel karakter dengan nilai statistik default.
Buat tabel karakter dengan nama dan level yang diberikan. Gunakan metatable dengan __index untuk memberikan nilai default bagi statistik apa pun yang tidak ada (health, mana, strength).
Logika:
- Buat tabel defaults dengan kunci:
health = 100,mana = 50,strength = 10 - Buat tabel karakter dengan kunci:
name(nama yang diberikan) danlevel(level yang diberikan) - Buat metatable dengan
__indexyang mengarah ke tabel defaults - Pasang metatable ke tabel karakter menggunakan
setmetatable() - Kembalikan tabel karakter
Parameter:
name(string): Nama karakterlevel(number): Level karakter
Nilai yang dikembalikan: Tabel karakter dengan name, level, dan statistik default yang dapat diakses melalui metatable (table)
Coba sendiri
function createCharacterWithDefaults(name, level)
-- Tulis kodemu di sini
end
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Logika dan Alur
1Iterasi Tabel Tingkat Lanjut
Iterasi dengan pairs()Iterasi dengan ipairs()pairs() vs. ipairs()Rangkuman: Lembar Karakter2Fungsi library tabel Lainnya
table.concat()Pembuatan tabel & unpack()table.sort()Pengurutan Kustom dengan FungsiRangkuman, Papan Skor TertinggiLatihan sendiri: Compiler Lua online