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: