Metatables let you customize how tables behave.
Basic Metatable
LUA
local mt = {
__index = function(self, key)
return "No field '" .. key .. "'"
end
}
local obj = setmetatable({}, mt)
print(obj.name) -- "No field 'name'"OOP with Metatables
LUA
local Student = {}
Student.__index = Student
function Student.new(name, age)
return setmetatable({name = name, age = age}, Student)
end
function Student:introduce()
return "Hi, I'm " .. self.name
end
local ram = Student.new("Ram", 22)
print(ram:introduce()) -- "Hi, I'm Ram"Inheritance
LUA
local Animal = {}
Animal.__index = Animal
function Animal.new(name)
return setmetatable({name = name}, Animal)
end
local Dog = setmetatable({}, {__index = Animal})
Dog.__index = Dog
function Dog.new(name)
return setmetatable(Animal.new(name), Dog)
end
function Dog:speak()
return self.name .. " says Woof!"
endTips
- Use metatables for OOP — Lua has no built-in class system.
__indexis the most commonly used metamethod.- Use
self:method()syntax — it passesselfautomatically.
Next: coroutines.