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