## 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: