Пример метатаблиц


-- Сложение дробных чисел a.b + a.b

f1 = {a = 1, b = 2}
f2 = {a = 2, b = 3}

-- This would fail:
-- s = f1 + f2

metafraction = {}
function metafraction.__add(f1, f2)
  sum = {}
  sum.b = f1.b * f2.b
  sum.a = f1.a * f2.b + f2.a * f1.b
  return sum
end

setmetatable(f1, metafraction)
setmetatable(f2, metafraction)

-- call __add(f1, f2) for f1
s = f1 + f2

Еще простой пример

Dog={}

function Dog:new(q)
    q = q or { name='1', age=1 }
    setmetatable(q, self)
    self.__index = self
    self.__len = function (self) 
        return self.age+10
    end
    return q
end

function Dog:dump()
    print(self.name..': '..self.age)
end

p1 = Dog:new()
p2 = Dog:new()
p2.name = '2'
p2.age = 2

p1:dump()
p2:dump()

print(#p1)