是否可以使用lua调试库检测变量值的更改时间。 类似于回调函数的东西,它会提供类似于更改值的函数,先前值等的详细信息。 这样的事情有可能吗?
我读过钩子,但我不确定钩子是否可以设置为变量。
答案 0 :(得分:2)
您可以在Lua中通过使用元表并保留“代理”表,并使用__newindex函数调用来检测添加变量的尝试,从而在某种程度上执行此操作。
“Lua编程”一书的“跟踪表访问”一节中介绍了这一点:
答案 1 :(得分:2)
如果您不介意使用调试器,那么一些调试器允许您设置Watch表达式,当表达式中的条件为真时将触发该表达式。我将在MobDebug中展示如何做到这一点(它使用的是lua调试库,但据我所知,没有直接的方法来检测变量)。
假设我们有一个类似下面的脚本start.lua
,并希望检测foo
获取值2的位置:
print("Start")
local foo = 0
for i = 1, 3 do
local function bar()
print("In bar")
end
foo = i
print("Loop")
bar()
end
print("End")
lua -e "require('mobdebug').listen()"
命令启动服务器。lua -e "require('mobdebug').loop()"
命令启动客户端。load start.lua
以加载脚本。step
,然后再输入step
。您将看到“暂停在文件start.lua第3行”。 foo
的价值是多少。输入eval foo
,您应该看到0。setw foo == 2
。您可以在setw命令后指定任何Lua表达式;当条件评估为true时,将停止执行脚本。foo
的值更改为2,并且在第8行停止执行。然后,您可以检查脚本和当前值(可以使用“eval”和“exec”命令运行要在脚本环境中评估的任何Lua代码,以找到触发更改的内容。此方法的好处是您不仅可以监视表值,还可以指定任何表达式。主要的缺点是您的脚本在调试器下运行,并且在每个步骤之后计算表达式,这可能会变得非常慢。