Перейти к содержимому
  • 0
SergOmarov

Каскадные вызовы setmetatable

Вопрос

Мне надо сделать что-то вроде множественного наследования, но 1 раз.

Что если установить для одной таблицы метатаблицу, а потом другой таблице установить это таблицу?

local meta1={}
local meta2={}
local myTable={}

meta2=setmetatable(meta2,meta1)
myTable=setmetatable(myTable,meta2)

--Будет ли myTable содержать все из meta1 и meta2?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендуемые сообщения

 

 

Будет ли myTable содержать все из meta1 и meta2?

Будет

meta1={a=1,b=2}
meta1.__index=meta1
meta2={c=3,d=4}
meta2.__index=meta2
myTable={e=5,f=6}
setmetatable(meta2,meta1)
setmetatable(myTable,meta2)
print(myTable.a,myTable.b)
print(myTable.c,myTable.d)
print(myTable.e,myTable.f) 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
meta1={a=1,b=2} meta1.__index=meta1

Зачем пишется meta1.__index=meta1?

И чем отличается этот meta1.__index от function meta1.__index(я второй юзаю)?

Изменено пользователем SergOmarov

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Метатаблица должна иметь элемент __index. Он может быть таблицей или функцией и указывает как получить элемент, отсутствующий в нашей таблице. Если __index - таблица, то элемент ищется в этой таблице. Если функция, то отсутствующий элемент вернет значение этой функции. __index не обязательно должен указывать на саму метатаблицу, но должен быть ее элементом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...