Lua: loadstring内部的函数似乎不工作?



在函数(doloadstring)中,我注意到loadstring,即使传递了正确的字符串,也不会修改函数变量。到底发生了什么事?

我的猜测是x是一个局部变量和loadstring只具有全局作用域?'

print('this works as I expect')
x = 0
loadstring('x = 1')()
print(x)
print('this does not')
function doloadstring(x, s)
print(x)
loadstring(s)() -- loadstring does not appear to change a variable in a function, is it because x is local
print(x)
print(z)
end
doloadstring('0', 'x = 1') -- x is not changed
doloadstring('0', 'z = 1') -- z is created tho

输出:

this works as I expect
1
this does not
0
0
nil
0
0
1

是的,结果是因为变量x不存在于函数获得的环境中(两者没有以任何方式连接)。有像debug这样的函数。upvaluejoin、调试。设置值和调试。Setlocal,但是它们都不会"连接"。一个带有upvalue函数的局部变量,使它们相同。

你可以这样做:(1)创建一个新的环境,(2)用本地变量和upvalues的值填充它,(3)用该环境调用函数(在Lua 5.2+中将环境传递给load或在Lua 5.1中使用setfenv),然后(4)从该环境中获取任何更改并将它们分配给本地变量/upvalues(你可以使用代理表来简化更改的检测)。

你可以从Mobdebug检查restore_vars和capture_vars函数做类似的事情。它解决了大多数情况下的问题(当你没有任何关于变量的信息时,这些变量可能会在你的"加载"中使用)。函数),所以如果你有一些关于它的信息,你肯定可以简化逻辑,并传递一个特定的环境,以满足你的需要(你不需要捕获所有上值和局部变量)。

最新更新