Вот реализация функции 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
Обратите внимание, что в lua REPL каждая строка представляет собой отдельный фрагмент с отдельными локальными переменными. Также возвращаются внутренние переменные (имена начинаются с '(', если вы хотите их удалить):
> 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
person
u0b34a0f6ae
schedule
14.05.2010