我设法用这个函数从Lua应用程序中获得了几乎所有的变量,但没有获得.lua文件的本地变量...
main.lua根目录下的示例:本地测试= 10
无法找到此文件。
你知道吗?
注意:我在一个Love2D应用程序中运行这个函数,这个函数是从一个Love回调函数(love.draw)调用的。
function getvarvalue (name)
local value, found
-- try local variables
local exit = false
local level = 0
while debug.getinfo(level) ~= nil do
local i = 1
while true do
local n, v = debug.getlocal(level, i)
if n then
print("local "..i.." "..level.." name:"..n)
end
if not n then break end
print(n)
if n == name then
value = v
found = true
end
i = i + 1
end
if found then return value end
level = level + 1
end
-- try upvalues
level = 0
while debug.getinfo(level) ~= nil do
local func = debug.getinfo(level).func
i = 1
while true do
local n, v = debug.getupvalue(func, i)
if n~= nil then print("up "..i.." "..level.." "..n) end
if not n then break end
if n == name then return v end
i = i + 1
end
if getfenv(func)[name] ~= nil then
return getfenv(func)[name]
end
level = level + 1
end
-- not found
return "?"
end
1条答案
按热度按时间bprjcwpo1#
正如@egor-skriptunoff指出的,函数中未使用的局部变量被“杀死”了。这究竟意味着什么?首先,Lua将函数视为值,这意味着
love.draw
实际上是一个字段,其中的赋值是一个函数。因此,函数本身是在运行时创建的。考虑以下示例:当Lua构造函数时,它会检查使用了哪些upvalues。这里发生了“kill of”,它不会检测myVar的使用,也不会创建对myVar的引用。即使它在
love.update
中更新了。调试API也不会显示myVar,因为它只显示引用的值。要强制Lua保留引用,可以使用一个简单的:love.draw
中的myVar = myVar
应该就可以了。