是否有一种方法可以在沙箱环境中运行脚本以不污染全局状态,但仍然能够要求为所述环境(而不是全局状态)设置全局vars的“someluafile”。
-- main script
local moduleXY = require"moduleXY"
v = 0
moduleXY.setV()
-- moduleXY
local function setV ()
v = 42
end
local moduleXY = {
setV = setV
}
return moduleXY因此,在调用之后,状态v为零,envs v设置为42 (而不是状态v为42和envs 0)。
luajit (SO5.1),cpp绑定sol3
发布于 2022-10-24 12:34:06
Lua5.1使用setfenv来更改函数的环境。下面是一个例子。
local moduleXY = require"moduleXY"
v = 0
env = setmetatable({}, {__index = _G}) -- create an environment
setfenv(moduleXY.setV, env) -- change the environment
moduleXY.setV()
print(v) -- 0
print(env.v) -- 42
setfenv(moduleXY.setV, _G) -- revert the environment
moduleXY.setV()
print(v) -- 42若要更改当前线程的环境,请使用setfenv(0)。
setfenv(0, env) -- this doesn't affect loaded functions
local moduleXY = require"moduleXY" -- module is loaded in 'env' environment
moduleXY.setV()
print(env.v) -- 42
setfenv(0, getfenv()) -- revert the thread environment
require"othermodule" -- load other module in default environmenthttps://stackoverflow.com/questions/74180702
复制相似问题