Added by , published
Алгоритмы, Наработки и Способности
Способ реализации:
Lua
Тип:
Наработка
Версия Warcraft:
1.36+

Модуль dict

Описание модуля dict

dict это удобный и расширяемый модуль для работы со таблицами как словарями на языке Lua. Модуль предоставляет объектно-ориентированный интерфейс, который инкапсулирует операции над таблицами, делая код более структурированным, читаемым и поддерживаемым. При этом централизованное управление операциями над словарем облегчает процесс отладки и отслеживания изменений в данных.
Хотя подобное возможно реализовать in-situ и напрямую работать с таблицами, абстракция, предоставляемая библиотекой, способствует более эффективной разработке, снижает риск ошибок и облегчает сопровождение и масштабирование проектов.
  1. Создание словаря:
local my_dict = dict()
  1. Добавление или обновление элементов:
my_dict:set("newKey", "newValue")
  1. Удаление элементов легко и безопасно удаляет элемент по заданному ключу.:
my_dict:remove("key1")
  1. Проверка наличия ключа позволяет проверить, существует ли определённый ключ в словаре.:
if my_dict:has("key2") then 
  -- действия
end
  1. Получение значения по ключу:
local value = my_dict:get("key2")
  1. Итерация по элементам позволяет удобно перебрать все пары ключ-значение в словаре:
my_dict:each(function(key, value) print(key, value) end)
  1. Получение списка ключей или значений:
local keys = my_dict:keys() 
local values = my_dict:values()
  1. Определение размера словаря:
local count = my_dict:size()
  1. Очистка словаря полностью очищает словарь от всех элементов:
my_dict:clear()

Программный интерфейс (API) модуля dict

---@class dict
---@field create fun(self:dict)
---@field set fun(self:dict, key:number|string, item:any):void
---@field remove fun(self:dict, key:number|string):void
---@field has fun(self:dict, key:number|string):boolean
---@field get fun(self:dict, key:number|string):any
---@field each fun(self:dict, callback:fun(key:number|string, value:any)): void
---@field keys fun(self:dict): table
---@field values fun(self:dict): table
---@field size fun(self:dict): number
---@field clear fun(self:dict): void
dict = dict or {}

Реализация

модуль dict (release 27.09.2024)
do
    ---@class dict
    ---@field create fun(self:dict)
    ---@field set fun(self:dict, key:number|string, item:any):void
    ---@field remove fun(self:dict, key:number|string):void
    ---@field has fun(self:dict, key:number|string):boolean
    ---@field get fun(self:dict, key:number|string):any
    ---@field each fun(self:dict, callback:fun(key:number|string, value:any)): void
    ---@field keys fun(self:dict): table
    ---@field values fun(self:dict): table
    ---@field size fun(self:dict): number
    ---@field clear fun(self:dict): void
    dict = dict or {}


    ---set
    ---@param key number|string
    ---@param item any
    function dict:set(key, item)
        self.data[key] = item
    end

    ---remove
    ---@param key number|string
    function dict:remove(key)
        self.data[key] = nil
    end

    ---has
    ---@param key number|string
    function dict:has(key)
        return self.data[key] ~= nil
    end

    ---get
    ---@param key number|string
    ---@return any
    function dict:get(key)
        return self.data[key]
    end

    -- Итератор
    ---@param callback fun(key:number|string, value:any)
    function dict:each(callback)
        for key, value in pairs(self.data) do
            callback(key, value)
        end
    end

    -- Получение ключей
    ---@return table
    function dict:keys()
        local keys = {}
        for key in pairs(self.data) do
            table.insert(keys, key)
        end
        return keys
    end


    -- Получение значений
    ---@return table
    function dict:values()
        local values = {}
        for _, value in pairs(self.data) do
            table.insert(values, value)
        end
        return values
    end


    -- Размер словаря
    ---@return number
    function dict:size()
        local count = 0
        for _ in pairs(self.data) do
            count = count + 1
        end
        return count
    end

    -- Очистка словаря
    function dict:clear()
        for key in pairs(self.data) do
            self.data[key] = nil
        end
    end

    dict.__meta = {
        __index = dict
    }

    ---create
    ---@param tbl table|nil
    ---@return dict
    function dict:create(tbl)
        local obj = {
            data = tbl or {}
        } ---@type dict
        return setmetatable(obj, self.__meta)
    end

    local dict_meta = {
        __call = dict.create
    }
    setmetatable(dict, dict_meta)
end

Заключение

Данный репозиторий я создал в основном для себя но ресурс с желанием поделиться наработками. Надеюсь на фидбек. Было бы интересно узнать о полезности данного репозитория для комьюнити. Может есть уже готовые работы, которые можно непосредственно внедрить в warcraft 3. Также было бы интересно узнать какие функции стоило бы еще внедрить в свою библиотеку.

Полезные источники

  • [1] - cheapack совсем не дешевый упаковщик *.lua файлов в *.wct файл Warcraft 3.
  • [2] IMP пакетный менеджер lua.
  • [3] imp-lua-mm менеджер модулей (imp mm).
  • [4] xlua это база функций расширяющих стандартный набор.
  • [5] MDTable класс мульти таблиц lua с синхронизацией pairs для онлайна в warcraft 3.
  • [6] статья про то какие бывают алгоритмы пуассоновского распределения и какие используются в какой мат. системе.
  • [luaforwindows] репозиторий хранящий Lua.exe файл для windows.
`
LOADING AD...