Поиск по сайту
Результаты поиска по тегам 'setmetatable'.
Найдено 3 результата
-
Метатаблицы — это самые обыкновенные таблицы, содержащие функции, которые изменяют стандартное поведение операторов в Lua. Метатаблица в Lua может быть у любого значения, но только у каждой таблицы может быть своя метатаблица, у всех остальных же одна на всех. Так например у типа значения строки есть своя встроенная метатаблица, которая позволяет нам делать так: ("строка"):rep(10) В данной таблице присутствует поле __index. А у потоков метатаблицы нет, а надо бы!!! Но обо всём по порядку. Для установки и получения метатаблиц в Lua по стандарту существует 4 функции: setmetatable(table: table, metatable: table):table — это основная функция, которая позволяет установить таблице метатаблицу. Такая функция работает только с таблицами. getmetatable(value: value):table or value — возвращает метатаблицу, если есть или значение поля __metatable в метатаблице, если есть. Работает со всеми значениями. debug.setmetatable(value: value):boolean or table — устанавливает метатаблицу любому значению и обходит метаполе __metatable. Действительно мощная штука, вот почему её убрали в Open Computers . debug.getmetatable(value: value):table or value — возвращает метатаблицу, обходя поле __metatable. Также отсутствует в OC. Теперь, я думаю, можно приступить к самим метаметодам. Для своего, а может быть и вашего удобства я их разделю на четыре категории: Разное Математические Сравнение Битовые операторы
- 20 ответов
-
- 12
-
У меня есть прототип объекта имеющего свои методы У другого объекта должны присутствовать все те же методы что и у первого объекта. Для создания объекта тараканы в голове сказали использовать метод метатаблицы __call Поначалу думал что сделаю что то вроде: --Здесь всё работает Object1 = setmetatable({},{ __call = function(self) return setmetatable({t=1},self) end }) Object1.__index = Object1 function Object1:method() print("method "..self.t) end obj = Object1() obj:method() --Вот тут уже нет Object2 = setmetatable(setmetatable({},Object1),{ __call = function(self) return setmetatable({t=2},self) end }) Object2.__index = Object2 function Object2:method2() self:method() end obj = Object2() obj:method2() и это будет работать. Но реальность меня огорчила...
- 2 ответа
-
- наследование
- setmetatable
-
(и ещё 1 )
Теги:
-
Мне надо сделать что-то вроде множественного наследования, но 1 раз. Что если установить для одной таблицы метатаблицу, а потом другой таблице установить это таблицу? local meta1={} local meta2={} local myTable={} meta2=setmetatable(meta2,meta1) myTable=setmetatable(myTable,meta2) --Будет ли myTable содержать все из meta1 и meta2?