lua metatable
--[[
Metatables allow you to, among other things, redefine operators.
Let's demonstrate with a simple vector "class".
--]]
Vector = {}
Vector.mt = {} -- The metatable we will be using
function Vector.new(x, y)
local vec = {}
setmetatable(vec, Vector.mt) -- "Link" the vector with the metatable
vec.x = x
vec.y = y
return vec
function Vector.add(u, v) -- Return the resulting vector of u+v
local result = Vector.new(u.x, u.y)
result.x = result.x + v.x
result.y = result.y + v.y
return result
--[[
This is where metatables get interesting, as we redefine the + operator
for vectors.
--]]
Vector.mt.__add = Vector.add
--[[
There are multiple predefined operators you can replace, such as:
__add(u+v), __sub(u-v), __mul(u*v), __div(u/v), __mod(u%v),
__unm(-u), __concat(u..v), __eq(u==v), __lt(u<v), __le(u<=v),
__len(#u), etc...
--]]