Lua Metatables and OOP

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!"
end

Tips

  • Use metatables for OOP — Lua has no built-in class system.
  • __index is the most commonly used metamethod.
  • Use self:method() syntax — it passes self automatically.

Next: coroutines.