Я люблю Lua. I love Lua.

Заполнение таблиц данными

Posted in Uncategorized by ilovelua on 20 января, 2016

Нередко встает задача заполнить таблицу данными.
Допустим, нам нужно создать список параметров.
Каждый параметр — это таблица вида:

{
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
Не помню, сам я это придумал, или где-то украл 🙂

Tagged with: , ,

комментариев 5

Subscribe to comments with RSS.

  1. Vladimir said, on 19 марта, 2016 at 7:08 дп

    Удобно, спасибо.

  2. _AMD_ said, on 25 октября, 2017 at 12:37 дп

    Через setmetatable можно сделать более изящно

    • ilovelua said, on 25 октября, 2017 at 6:18 дп

      Можно поподробнее с примерами, плиз?

      • _AMD_ said, on 25 октября, 2017 at 10:24 пп

        Хотел сделать скриншот, а скриншотилка зависла)

        Я не знаю, будет ли понятно то, что на скрине, но суть в том, что в Lua ведь есть подобие ООП и работает оно через метатаблицы. То, что вы создаете, это по сути объект, но создаете вы его не очень красиво и правильно.

        Через setmetatable можно спрятать ненужные для глаза методы.а также наделять таблицы полезными свойствами, например свойствами функции.

        Вот здесь можно посмотреть небольшой пример, как я сделал уровни в своем автодонате для Garry’s Mod.
        https://gist.github.com/aeff0b38cda7312f71d48fd532865c34

        IGS.LVL.Add(iNeedSum) создает LVL объект с готовыми методами, типа LVL:SetBonus()

      • ilovelua said, on 7 ноября, 2017 at 8:13 дп

        Да, я тоже так умею, спасибо 🙂
        Просто для конкретного случая, а именно заполнения таблицы данными, а не работы с этими данными, метатаблицы просто избыточны.


Оставьте комментарий