Исходник Гайд Либа для статических объектов

Всем доброго времени суток, с вами изобретатель велосипедов.
Как-то раз меня разочаровали возможности луа тем, что нельзя работать в одном блоке кода с запоминающимся значением без дополнительного объявления новой переменной в глобальную метатаблицу. Не знаю, кому будет интересна эта "либа", но в интернете говорили, что такое невозможно сделать в луа. Поэтому я оставлю эту тему здесь.
Создание объекта: За основу взята функция debug.getinfo, благодаря которой генерируется ключ к таблице static_table (В итоге получаем что-то типа key="main.lua:22"; не знаю, какую еще можно было придумать генерацию уникального ключа).
При обращении объекта к методу 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 участке кода. Дабы избежать объявления переменной в самом верху скриптового файла, можно воспользоваться статической переменной.
 

Вложения

  • static.lua
    1 KB · Просмотры: 21

imring

Ride the Lightning
Всефорумный модератор
2,355
2,516
в скомпилированных скриптах будет возвращаться main.lua:0 в любом участке кода
в таком случае можно воспользоваться do-end блоками:
Lua:
do
local var
function test1()
  if var == nil then
    var = 0
  end
  print(var)

  var = 11
end
end

for i = 1, 10 do
  test1()
end

--[[
0
11
11
11
11
11
11
11
11
11
]]
 
  • Нравится
Реакции: vadimka0216

vadimka0216

Известный
Автор темы
38
63
в таком случае можно воспользоваться do-end блоками:
Lua:
do
local var
function test1()
  if var == nil then
    var = 0
  end
  print(var)

  var = 11
end
end

for i = 1, 10 do
  test1()
end

--[[
0
11
11
11
11
11
11
11
11
11
]]
Ну да, зависит от задач и компактности кода.
в скомпилированных скриптах будет возвращаться main.lua:0 в любом участке кода
В скомпилированных скриптах отладка априори не работает. А вся фича заключается в объекте (или модуле) "debug".
 

sc6ut

неизвестный
Модератор
382
1,075
Объясните зачем это надо
шапку читай, там всё написано.
В коде часто возникает момент, когда хочется сделать глобальную переменную(например, для сохранения состояния диалогов, бота, времени обновлений скрипта или других значений), но использовать ее по факту надо только в 1 участке кода. Дабы избежать объявления переменной в самом верху скриптового файла, можно воспользоваться статической переменной.
 
  • Нравится
Реакции: Smeruxa