Metatables
In Lua, since everything is a tables, metatables are a paradigm that lets you change the behaviour of a table, using another table. For example, you can define the behaviour when 2 tables are added together using the +
operator by defining a metatable with an __add
method. This is similar to the concept of [[magic methods (Python)]], though in Python magic methods are defined on instance's class.
In this example, I'm defining addition as the sum of all keys in the left-most table
local metatable = {
__add = function(self, other)
local output = {}
for k, v in pairs(self) do
output[k] = self[k] + other[k]
end
return output
end
}
local t = {A=100, B=200}
setmetatable(t, metatable)
local result = t + {A=50, B=100}
print(result['A']) -- 150
print(result['B']) -- 150
__add
is an arithmetic metamethod, alongside __mul
(multiplication behaviour of *
between 2 tables), __div
(division), __mul
(multiplication), __sub
(subtraction), __unm
(negation) and __pow
(exponential).
There are also relational metamethods for comparision: __eq
, __lt
and __lte
Lastly, Lua Table-Access Metamethods allow for defining behaviour when missing keys are looked up.
References: