Class melalui Metatabel
Simulasikan class menggunakan tabel dan __index untuk mencari metode.
Class melalui Metatabel adalah pelajaran Lua Academy gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Lua Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Lua Academy mencakup 4 pelajaran total.
Pola Tabel Kelas
Di Lua, sebuah "kelas" hanyalah tabel yang menyimpan metode. Instans adalah tabel yang metatabelnya menunjuk ke tabel kelas melalui __index. Dengan demikian, semua metode dapat diakses pada instans melalui rantai pencarian.
local Animal = {}
Animal.__index = Animal
function Animal.new(name, sound)
return setmetatable({name=name, sound=sound}, Animal)
end
function Animal:speak()
print(self.name .. " says " .. self.sound)
end
local dog = Animal.new("Rex","Woof")
dog:speak() -- Rex says Woof__index Menunjuk ke Kelas
Menetapkan ClassName.__index = ClassName berarti "cari kunci yang tidak ditemukan di tabel kelas". Saat metode instans dipanggil, Lua tidak menemukannya di instans, lalu memeriksa metatabel (__index), menemukan kelas, dan mencari metode tersebut di sana.
local Point = {}
Point.__index = Point
Point.type = "2D Point"
function Point.new(x,y)
return setmetatable({x=x,y=y}, Point)
end
function Point:magnitude()
return math.sqrt(self.x^2 + self.y^2)
end
local p = Point.new(3,4)
print(p:magnitude()) -- 5.0
print(p.type) -- 2D Point (from class)Pola Konstruktor
Fungsi new() adalah konstruktor: fungsi ini membuat tabel dengan data instans dan mengembalikannya dalam metatabel yang menunjuk ke kelas. Inilah cara standar untuk membuat objek di Lua.
local Circle = {}
Circle.__index = Circle
function Circle.new(cx, cy, radius)
assert(radius > 0, "radius must be positive")
return setmetatable({cx=cx, cy=cy, r=radius}, Circle)
end
function Circle:area()
return math.pi * self.r^2
end
function Circle:perimeter()
return 2 * math.pi * self.r
end
local c = Circle.new(0, 0, 5)
print(string.format("Area: %.2f", c:area()))Sintaks Metode vs Fungsi
obj:method() adalah bentuk singkat dari obj.method(obj). Definisikan metode dengan sintaks titik dua (function Cls:method()) untuk mendapatkan self implisit. Panggil dengan titik dua untuk meneruskan instans. Mencampur titik dan titik dua dapat menyebabkan bug yang sulit dideteksi.
local Dog = {}
Dog.__index = Dog
-- Define with colon: self is implicit
function Dog:bark(times)
for i = 1, (times or 1) do
print(self.name .. ": Woof!")
end
end
function Dog.new(name)
return setmetatable({name=name}, Dog)
end
local d = Dog.new("Buddy")
d:bark(2) -- Buddy: Woof! (x2)
-- Dog.bark(d,1) -- same thing, explicit selfField Tingkat Kelas vs Tingkat Instans
Field pada tabel kelas digunakan bersama oleh semua instans (variabel kelas). Field pada tabel instans hanya berlaku untuk instans tersebut. Instans dapat menutupi field kelas dengan membuat field sendiri yang memiliki nama sama.
local Entity = {}
Entity.__index = Entity
Entity.count = 0 -- class-level counter
function Entity.new(name)
Entity.count = Entity.count + 1
return setmetatable({name=name, id=Entity.count}, Entity)
end
local a = Entity.new("alpha")
local b = Entity.new("beta")
local c = Entity.new("gamma")
print(Entity.count) -- 3
print(a.id, b.id, c.id) -- 1 2 3tostring untuk Kelas
Tambahkan __tostring ke tabel kelas agar keluaran cetak mudah dibaca. Karena metatabel instans adalah kelas, dan kelas memiliki __tostring, semua instans akan menggunakannya secara otomatis.
local Vec2 = {}
Vec2.__index = Vec2
Vec2.__tostring = function(v)
return string.format("Vec2(%g, %g)", v.x, v.y)
end
function Vec2.new(x,y)
return setmetatable({x=x,y=y}, Vec2)
end
function Vec2.__add(a, b)
return Vec2.new(a.x+b.x, a.y+b.y)
end
local v1 = Vec2.new(1,2)
local v2 = Vec2.new(3,4)
print(v1+v2) -- Vec2(4, 6)Memeriksa Jenis Instans
Periksa apakah sebuah objek merupakan instans dari suatu kelas dengan membandingkan metatabelnya dengan tabel kelas. Ini adalah padanan instanceof di Lua.
local Dog = {}
Dog.__index = Dog
function Dog.new(name)
return setmetatable({name=name}, Dog)
end
local function isDog(obj)
return getmetatable(obj) == Dog
end
local d = Dog.new("Rex")
local t = {}
print(isDog(d)) -- true
print(isDog(t)) -- falseMetode Privat
Metode privat adalah fungsi lokal dalam berkas modul. Metode tersebut tidak dapat dipanggil dari luar, tetapi dapat diakses di dalam metode publik modul sebagai upvalue.
local Account = {}
Account.__index = Account
-- Private helper
local function validate(amount)
return type(amount)=="number" and amount > 0
end
function Account.new(balance)
return setmetatable({balance=balance or 0}, Account)
end
function Account:deposit(amount)
assert(validate(amount), "invalid amount")
self.balance = self.balance + amount
end
function Account:getBalance() return self.balance endPerbandingan Kelas
Lebih muat __eq dan __lt untuk kesetaraan dan pengurutan khusus. Lua hanya memanggil __eq untuk tabel jika kedua operand menggunakan metatabel yang sama.
local Temp = {}
Temp.__index = Temp
Temp.__eq = function(a,b) return a.celsius == b.celsius end
Temp.__lt = function(a,b) return a.celsius < b.celsius end
Temp.__tostring = function(t)
return t.celsius.."°C"
end
function Temp.new(c)
return setmetatable({celsius=c}, Temp)
end
local t1 = Temp.new(100)
local t2 = Temp.new(0)
print(t1 == Temp.new(100)) -- true
print(t2 < t1) -- trueBeberapa Kelas
Setiap kelas merupakan tabel independen dengan metatabelnya sendiri. Objek dari kelas yang berbeda memiliki metatabel yang berbeda. Inilah dasar sistem OOP multi-kelas di Lua.
local Cat = {}
Cat.__index = Cat
function Cat.new(name) return setmetatable({name=name,lives=9},Cat) end
function Cat:loseLife() self.lives=self.lives-1; return self.lives end
local Dog2 = {}
Dog2.__index = Dog2
function Dog2.new(name) return setmetatable({name=name,tricks={}},Dog2) end
function Dog2:learn(t) self.tricks[#self.tricks+1]=t end
local c = Cat.new("Whiskers")
local d = Dog2.new("Buddy")
d:learn("sit"); d:learn("stay")
print(c:loseLife(), #d.tricks) -- 8 2Pemeriksaan Singkat
Mengapa kita menetapkan ClassName.__index = ClassName?
Ringkasan: Kelas melalui Metatabel
Ringkasan:
- Kelas = tabel +
__index = self - Konstruktor:
function Cls.new(...) return setmetatable({}, Cls) end - Metode: didefinisikan pada tabel kelas, dipanggil dengan sintaks titik dua
- Field kelas vs instans: field kelas digunakan bersama, field instans berlaku per objek
- Pemeriksaan jenis:
getmetatable(obj) == Cls
Belajar Lua dengan tutor AI — gratis
Tulis dan jalankan kode asli di browser kamu, dapatkan bantuan instan dari tutor AI 24/7, dan lanjutkan di mana kamu tinggalkan di web atau aplikasi.
- Kursus
- 40
- Pelajaran
- 159
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Class melalui Metatabel” gratis?
Ya — teks lengkap “Class melalui Metatabel” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Lua Academy, upgrade ke CoddyKit PRO. Kursus Lua Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Class melalui Metatabel”?
Simulasikan class menggunakan tabel dan __index untuk mencari metode. Kamu berlatih Lua Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Lua Academy?
Tidak diperlukan pengalaman sebelumnya. Lua Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.
Berapa lama pelajaran “Class melalui Metatabel” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Lua Academy ini?
Ya. Setiap pelajaran Lua Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Class melalui Metatabel
- Konstruktor dan new()
- Metode Instans dan self
- Enkapsulasi dengan Closure