Panduan Pemula untuk Metatable Lua

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

Lua - Metatables

Apa Itu Metatable?

Sebelum kita masuk ke hal yang mendalam, mari kita mengerti apa itu metatable. Bayangkan Anda punya kotak peralatan ajaib yang dapat memberikan kekuatan super bagi tabel Lua biasa. Itu sebenarnya apa yang dilakukan metatable! Itu adalah tabel Lua biasa yang menentukan perilaku khusus bagi tabel lain.

Metametode __index

Tempat pertama yang kita kunjungi dalam perjalanan ajaib ini adalah metametode __index. Penyihir kecil ini membantu kita mengatasi kunci yang hilang 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"), bukannya memberikan kesalahan, Lua memanggil fungsi __index kita, yang mengembalikan "warna tak diketahui".

__index Sebagai Tabel

Metametode __index juga dapat menjadi 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 dalam hewan, Lua mencari di tabel __index.

Metametode __newindex

Selanjutnya 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 = "tes"  -- Ini akan memicu kesalahan

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

Menambah perilaku operator ke Tabel

Sekarang, mari kita berikan tabel kita beberapa keterampilan matematika!

Metametode __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! Metametode __add dipanggil saat kita menggunakan operator + pada tabel kita.

Metametode __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("Halo"))  -- Output: Halo, Penggemar Lua!

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

Metametode __tostring

Terakhir tapi bukan paling kurang, mari kita membuat tabel kita tampak 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

Metametode __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 menarik metatable Lua. Kita telah menelusuri banyak hal, dari mengatasi kunci yang hilang dengan __index hingga membuat tabel kita dapat dipanggil dengan __call. Ingat, latihan membuat sempurna, jadi jangan khawatir untuk mencoba konsep-konsep ini.

Berikut adalah tabel rujukan singkat metametode yang kita pelajari:

Metametode Tujuan
__index Menghandle akses ke kunci yang hilang
__newindex Mengontrol penambahan kunci baru
__add Menentukan perilaku penjumlahan
__call Membuat tabel dapat dipanggil seperti fungsi
__tostring Menyediakan representasi string dari tabel

Terus menjelajahi, terus mengoding, dan terutama, bersenang-senang dengan Lua! Siapa tahu, program ajaib apa yang Anda akan buat berikutnya?

Credits: Image by storyset