A

Size: a a a
A

A
A
IB
A
A
a = 5означает
b = 10
c = a + b
c = c.__add(a, b)и в итоге
c = a + b
setmetatable(с, {__add = function(a, b) return a - b end})
тоc = a + bбудет с = -5, а
d = a + bпо прежнему будет d = 10
A

I

S
a = 5означает
b = 10
c = a + b
c = a.__add(a, b)a и b, должен вызваться метаметод у a
и в итогеc = a + bвыдаст
с = 15
Но у чисел действительно нет метатаблиц, это бы вызвалось будь a и b строками/таблицами/cdataA
S
__index своей метатаблицы. Если у метатаблицы есть такое поле — они доискивают. Нет поля — нет доискивания.A
__index своей метатаблицы. Если у метатаблицы есть такое поле — они доискивают. Нет поля — нет доискивания.S
a = {}
b = {}
setmetatable(a, b)
Ничего не изменилось. a не стало где-то доискивать ключи, потому что у b нет специальных полей.b поле __index и a начнёт доискивать по этому полю ключи. Удалим это поле — перестанет. Добавим — начнёт, удалим — перестанет.b поле __add с функцией — и a можно будет складывать со всякой фигнёй. Удалим — нельзя будет складывать.A
a = {}
b = {}
setmetatable(a, b)
Ничего не изменилось. a не стало где-то доискивать ключи, потому что у b нет специальных полей.b поле __index и a начнёт доискивать по этому полю ключи. Удалим это поле — перестанет. Добавим — начнёт, удалим — перестанет.b поле __add с функцией — и a можно будет складывать со всякой фигнёй. Удалим — нельзя будет складывать.var, текстом 'string', функцией func() ... а в данном случае с таблицей tab={})?__index, __add) которые выполняются когда мы хотим что-то сделать со значением?S
S
IB
__index своей метатаблицы. Если у метатаблицы есть такое поле — они доискивают. Нет поля — нет доискивания.S