首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >要求但不要突破沙箱环境-卢吉特

要求但不要突破沙箱环境-卢吉特
EN

Stack Overflow用户
提问于 2022-10-24 11:51:44
回答 1查看 43关注 0票数 0

是否有一种方法可以在沙箱环境中运行脚本以不污染全局状态,但仍然能够要求为所述环境(而不是全局状态)设置全局vars的“someluafile”。

代码语言:javascript
复制
-- 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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-24 12:34:06

Lua5.1使用setfenv来更改函数的环境。下面是一个例子。

代码语言:javascript
复制
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)

代码语言:javascript
复制
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 environment
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74180702

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档