Les métatables c'est "le truc" de lua, et dans le cas de __add, ca se rapproche de la surchage d'opérateur en c++ (par exemple).
Donc oui tu peux le faire avec une fonction qui prends comme arguments 2 tables, mais tu perd le "sucre syntaxique", c'est à dire la possibilité d'écrire
c = a + b
mais aussi le fait de devoir connaitre quelle fonction ajoute quoi avec quoi, j'hésite à faire le rapprochement avec les templates du c++ (car trop souvent en lua les gens essais de la POO, alors que ca n'est pas l'idée).
dans le liens, quand on écrit:
print(unpack(t1 + t2))
On n'a pas besoin de connaitre la fonction à utiliser pour l'addition, puisqu'elle doit être dans la métatable de t1, alors que si tu le fait avec une fonction foobar tu es obligé de l'appeler explicitement.
Après c'est un exemple, donc le code n'est pas très intéressant.
Un exemple qui le serait un peu plus ca serait d'imaginer la meme chose avec des vecteur 2D et 3D par exemple, et de définir une fonction lerp comme ca :
function lerp(a, b, x) return a * (1.0 - x) + b * x end
Elle fonctionne avec des nombre et des tables qui ont une metatable definissant __add et __mul.