Всем доброго времени суток, с вами изобретатель велосипедов.
Как-то раз меня разочаровали возможности луа тем, что нельзя работать в одном блоке кода с запоминающимся значением без дополнительного объявления новой переменной в глобальную метатаблицу. Не знаю, кому будет интересна эта "либа", но в интернете говорили, что такое невозможно сделать в луа. Поэтому я оставлю эту тему здесь.
Создание объекта: За основу взята функция debug.getinfo, благодаря которой генерируется ключ к таблице static_table (В итоге получаем что-то типа key="main.lua:22"; не знаю, какую еще можно было придумать генерацию уникального ключа).
При обращении объекта к методу get, из таблицы static_table извлекается значение с ключом key, если это возможно. Если невозможно, то элемент инициализируется значением фактического параметра init_value.
При обращении объекта к методу set, в таблицу static_table с ключом key записывается значение из фактического параметра val, если такой элемент в таблице существует.
При обращении объекта к методу get, из таблицы static_table извлекается значение с ключом key, если это возможно. Если невозможно, то элемент инициализируется значением фактического параметра init_value.
При обращении объекта к методу set, в таблицу static_table с ключом key записывается значение из фактического параметра val, если такой элемент в таблице существует.
getStatic() - функция находится в глобальном неймспейсе, которая создает объект для работы со "статической" переменной. Есть момент, что ее нельзя вызывать в одной строке, иначе ключи будут одинаковыми (типа: var1,var2=getStatic(),getStatic() - одинаковые объекты).
Пример:
--подключаем либу через dofile("static.lua"); или require("static");
function test1()
local var=getStatic(); var:get(0);--получение "статической" переменной и ее инициализация(при ранее ее необъявленности)
--[[
при получении значения var:get();
будет возвращаться 0, если ранее значение не изменялось методом var:set(...);
...
]]
var:set(11);
--[[
при получении значения var:get();
будет возвращаться 11
...
]]
end
for i=1,10 do test1(); end; -- в первой итерации произойдет инициализация объекта нулем, в последующих вызовах мы получим значение 11
В коде часто возникает момент, когда хочется сделать глобальную переменную(например, для сохранения состояния диалогов, бота, времени обновлений скрипта или других значений), но использовать ее по факту надо только в 1 участке кода. Дабы избежать объявления переменной в самом верху скриптового файла, можно воспользоваться статической переменной.