Заполнение таблиц данными
Нередко встает задача заполнить таблицу данными.
Допустим, нам нужно создать список параметров.
Каждый параметр — это таблица вида:
{ name = 'Name', value = '', type = 'string', }
Соответственно, список параметров будет выглядеть как-то так:
{ { name = 'Name', value = '', type = 'string', }, { name = 'Order', value = 1, type = 'number', }, { name = 'File', value = 'default.lua', type = 'string', }, }
Если параметров много, то для удобства заполнения я создаю функцию:
local function createParameter(name, value, type) return { name = name, value = value, type = type, } end
Список параметров начинает выглядеть так:
{ createParameter('Name', '', 'string'), createParameter('Order', 1, 'number'), createParameter('File', 'default.lua', 'string'), }
Однако, если параметров в функцию передается много, то при добавлении новой записи часто трудно понять, какой параметр за какое поле отвечает. Чтобы облегчить себе задачу, я в таблицу данных добавляю функции заполнения параметров:
local function Property(name) return { name = name, Value = function(self, value) self.value = value return self end, Type = function(self, type) self.type = type return self end, } end
Теперь заполнение таблицы параметров выглядит так:
{ Property('Name') :Value('') :Type('string'), Property('Order') :Value(1) :Type('number'), Property('File') :Value('default.lua') :Type('string'), }
Теперь каждый параметр подписан, а если есть опциональные поля, то их можно пропустить, а не писать такое:
createParameter('Name', '', nil, nil, nil, 'string'),
PS
Не помню, сам я это придумал, или где-то украл 🙂
Удобно, спасибо.
Через setmetatable можно сделать более изящно
Можно поподробнее с примерами, плиз?
Хотел сделать скриншот, а скриншотилка зависла)
Я не знаю, будет ли понятно то, что на скрине, но суть в том, что в Lua ведь есть подобие ООП и работает оно через метатаблицы. То, что вы создаете, это по сути объект, но создаете вы его не очень красиво и правильно.
Через setmetatable можно спрятать ненужные для глаза методы.а также наделять таблицы полезными свойствами, например свойствами функции.
Вот здесь можно посмотреть небольшой пример, как я сделал уровни в своем автодонате для Garry’s Mod.
https://gist.github.com/aeff0b38cda7312f71d48fd532865c34
IGS.LVL.Add(iNeedSum) создает LVL объект с готовыми методами, типа LVL:SetBonus()
Да, я тоже так умею, спасибо 🙂
Просто для конкретного случая, а именно заполнения таблицы данными, а не работы с этими данными, метатаблицы просто избыточны.