Menu
CoddyTech

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

Dalam 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.

challenge icon

Tantangan

Mudah

Tulis 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) dan level (level yang diberikan)
  • Buat metatable dengan __index yang mengarah ke tabel defaults
  • Pasang metatable ke tabel karakter menggunakan setmetatable()
  • Kembalikan tabel karakter

Parameter:

  • name (string): Nama karakter
  • level (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
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Logika dan Alur

Latihan sendiri: Compiler Lua online