Вот реализация функции locals()
. Он вернет таблицу локальных пользователей из области вызова:
function locals()
local variables = {}
local idx = 1
while true do
local ln, lv = debug.getlocal(2, idx)
if ln ~= nil then
variables[ln] = lv
else
break
end
idx = 1 + idx
end
return variables
end
Обратите внимание, что в REPL lua каждая строка представляет собой отдельный кусок с отдельными местными жителями. Также возвращаются внутренние переменные (имена начинаются с '(', если вы хотите их удалить):
> local a = 2; for x, v in pairs(locals()) do print(x, v) end
a 2
(*temporary) function: 0x10359b38
Спасибо за согласие. Вы открыли последний кусок головоломки! ; -)
Upvalues - это локальные переменные из внешних областей, которые используются в текущей функции. Их нет ни в _G
, ни в locals()
function upvalues()
local variables = {}
local idx = 1
local func = debug.getinfo(2, "f").func
while true do
local ln, lv = debug.getupvalue(func, idx)
if ln ~= nil then
variables[ln] = lv
else
break
end
idx = 1 + idx
end
return variables
end
Пример (обратите внимание, вы должны использовать, чтобы он появился):
> local a= 2; function f() local b = a; for x,v in pairs(upvalues()) do print(x,v) end end; f()
a 2