您可以执行类似的操作来保存/恢复这些上值(请注意,它不处理不同函数之间共享的上值):
local function capture(func)
local vars = {}
local i = 1
while true do
local name, value = debug.getupvalue(func, i)
if not name then break end
vars[i] = value
i = i + 1
end
return vars
end
local function restore(func, vars)
for i, value in ipairs(vars) do
debug.setupvalue(func, i, value)
end
end
function ffactory(x) return function() return x end end
local f1 = ffactory(5)
local f2 = (loadstring or load)(string.dump(f1))
restore(f2, capture(f1)) --<-- this restored upvalues from f1 for f2
print(f1(), f2())
这在 Lua 5.1 和 Lua 5.2 下都有效。
如果您进行更改,请注意一个有趣的结果ffactory
稍微(添加math.abs(0)
;任何以任何方式使用全局表的东西都可以):
function ffactory(x) return function() math.abs(0) return x end end
现在,如果你恢复 upvalues,你会得到相同的结果,但如果你不恢复 upvalues,你会在 Lua 5.2 下得到一个运行时错误:
lua.exe: upvalues.lua:19: attempt to index upvalue '_ENV' (a nil value)
stack traceback:
upvalues.lua:19: in function 'f2'
upvalues.lua:24: in main chunk
[C]: in ?