Lua - Metatables: Panduan untuk Pemula

Halo teman-teman yang sedang belajar pemrograman! Hari ini, kita akan melakukan perjalanan yang menarik ke dunia metatable Lua. Jangan khawatir jika Anda belum pernah menulis baris kode pun sebelumnya - saya akan menjadi panduan ramah Anda, dan kita akan mengexploreasi topik ini bersama. Jadi, ambil secangkir minuman favorit Anda, dan mari kita masuk ke dalamnya!

Lua - Metatables

Apa Itu Metatable?

Sebelum kita masuk ke detailnya, mari kita pahami apa itu metatable. Bayangkan Anda memiliki kotak peralatan ajaib yang dapat memberikan superpower kepada tabel Lua biasa. Itu sebenarnya apa yang dilakukan metatable! Itu adalah tabel Lua biasa yang menentukan perilaku spesial untuk tabel lain.

Metamethod __index

Tempat pertama yang kita kunjungi dalam perjalanan ajaib ini adalah metamethod __index. Penyihir kecil ini membantu kita mengatasi kunci yang hilang di dalam tabel kita.

Penggunaan Dasar __index

Mari kita mulai dengan contoh sederhana:

local buah = {apple = "merah", banana = "kuning"}
local metatable = {
__index = function(tabel, kunci)
return "warna tak diketahui"
end
}
setmetatable(buah, metatable)

print(buah.apple)    -- Output: merah
print(buah.cherry)   -- Output: warna tak diketahui

Dalam contoh ini, kita membuat tabel buah dan metatable dengan fungsi __index. Ketika kita mencoba mengakses kunci yang tidak ada (seperti "cherry"), instead of giving us an error, Lua memanggil fungsi __index kita, yang mengembalikan "warna tak diketahui".

__index Sebagai Tabel

Metamethod __index juga dapat menjadi sebuah tabel:

local hewan = {dog = "woof", cat = "meow"}
local metatable = {
__index = {
cow = "moo",
pig = "oink"
}
}
setmetatable(hewan, metatable)

print(hewan.dog)  -- Output: woof
print(hewan.cow)  -- Output: moo

Di sini, jika kunci tidak ditemukan di hewan, Lua mencari di tabel __index.

Metamethod __newindex

Berikutnya adalah __newindex, penjaga penugasan kunci baru.

local terpelihara = {}
local metatable = {
__newindex = function(tabel, kunci, nilai)
error("Tabel ini adalah read-only!")
end
}
setmetatable(terpelihara, metatable)

terpelihara.newKey = "test"  -- Ini akan memicu kesalahan

Dalam contoh ini, setiapupaya menambahkan kunci baru ke terpelihara akan memicu pesan kesalahan kita. Itu seperti memiliki penjaga untuk tabel Anda!

Menambahkan Perilaku Operator ke Tabel

Sekarang, mari kita beri tabel kita kemampuan matematika!

Metamethod __add

local vektor = {x = 10, y = 20}
local metatable = {
__add = function(v1, v2)
return {x = v1.x + v2.x, y = v1.y + v2.y}
end
}
setmetatable(vektor, metatable)

local hasil = vektor + {x = 5, y = 10}
print(hasil.x, hasil.y)  -- Output: 15 30

Kita baru saja mengajarkan tabel vektor bagaimana cara melakukan penjumlahan! Metamethod __add dipanggil saat kita menggunakan operator + pada tabel kita.

Metamethod __call

Ingin membuat tabel Anda berperilaku seperti fungsi? Kenalkan __call!

local penyapa = {name = "Penggemar Lua"}
local metatable = {
__call = function(tabel, salam)
return salam .. ", " .. tabel.name .. "!"
end
}
setmetatable(penyapa, metatable)

print(penyapa("Hello"))  -- Output: Hello, Penggemar Lua!

Sekarang tabel penyapa dapat dipanggil seperti fungsi. Magic, kan?

Metamethod __tostring

Terakhir tapi bukan paling kurang, mari kita membuat tabel kita lebih menarik dengan __tostring.

local orang = {name = "Alice", age = 30}
local metatable = {
__tostring = function(tabel)
return tabel.name .. " berusia " .. tabel.age .. " tahun"
end
}
setmetatable(orang, metatable)

print(orang)  -- Output: Alice berusia 30 tahun

Metamethod __tostring dipanggil saat kita mencoba mengonversi tabel kita menjadi string, seperti saat kita menggunakan print().

Kesimpulan

Selamat! Anda telah mengambil langkah pertama ke dalam dunia yang menakjubkan metatable Lua. Kita telah meliputi banyak hal, mulai dari penanganan kunci yang hilang dengan __index hingga membuat tabel callable dengan __call. Ingat, latihan membuat sempurna, jadi jangan khawatir untuk mencoba konsep-konsep ini.

Berikut adalah tabel referensi metamethod yang kita pelajari:

Metamethod Tujuan
__index Menangani akses ke kunci yang hilang
__newindex Mengontrol penambahan kunci baru
__add Menentukan perilaku penjumlahan
__call Membuat tabel callable seperti fungsi
__tostring Menyediakan representasi string dari tabel

Terus eksplorasi, terus kode, dan yang paling penting, bersenang-senang dengan Lua! Siapa tahu apa program ajaib yang Anda akan buat berikutnya?

Credits: Image by storyset