在不污染全局环境的情况下加载文件。
2014-1-17 11:10:4
收藏:0
阅读:107
评论:3
如何在不污染全局环境的情况下加载一个包含 Lua 表和变量的文件?因为仅仅使用 loadfile 并运行它会将所有内容加载到全局空间中,并可能覆盖其他我不想要的变量。
原文链接 https://stackoverflow.com/questions/9540732
点赞
stackoverflow用户44844
以下是_RBerteig_的答案的 dofile() 版本,您可以提供环境并返回结果(如果有的话)(我尝试将其作为注释,但无法将其格式化):
local function DofileIntoEnv(filename, env)
setmetatable ( env, { __index = _G } )
local status, result = assert(pcall(setfenv(assert(loadfile(filename)), env)))
setmetatable(env, nil)
return result
end
我想要能够将多个文件加载到同一个环境中,并且其中一些文件中有一个'return something'。 感谢RBerteig,您的答案非常有帮助和指导!
2013-05-03 20:06:58
stackoverflow用户3317263
在 Lua > 5.2 中
function run_test_script(scriptfile)
local env = setmetatable({}, {__index=_G})
assert(pcall(loadfile(scriptfile,"run_test_script",env)))
setmetatable(env, nil)
return env
end
```
函数 run_test_script
可以运行一个脚本文件,并且将这个脚本文件的环境设置为一个新的空表,在此空表中运行脚本文件。在脚本文件执行完之后,将此空表返回。
传入参数:
scriptfile: 字符串类型,表示需要运行的脚本文件路径。
返回值:
env: 表类型,表示脚本文件运行后的环境。```
2021-11-10 09:15:30
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
在 Lua 5.1 中,可以通过以下方式实现没有过多错误处理的运行脚本:
-- 加载并运行提供环境中的脚本 -- 返回修改后的环境表 function run(scriptfile) local env = setmetatable({}, {__index=_G}) assert(pcall(setfenv(assert(loadfile(scriptfile)), env))) setmetatable(env, nil) return env end
第一行创建了一个空的环境表,可以访问所有现有的全局变量,但是不能直接更改它们,因为它们仅通过
__index
元方法的代理可见。脚本创建的任何全局变量将存储在env
中,并被返回。对于只设置一堆配置参数的简单脚本以及可能需要根据运行时条件调用简单安全函数来设置它们的情况,这种方法会很好地工作。请注意,使全局变量对脚本可见是一种便利。尽管全局变量无法以明显的方式从脚本中修改,但
_G
是一个全局变量,其中包含对全局环境的引用(包含_G._G
、_G._G._G
等),并且_G
可以从脚本中进行修改,这可能会导致进一步的问题。因此,与其将
_G
用作索引,更好的方法是构建一个仅包含已知安全和脚本作者需要的函数的表。完整的解决方案是在沙箱中运行脚本,并可能进一步受到保护,以防止意外(或故意)拒绝服务或更糟。沙盒在 Lua 用户维基中有更详细的介绍。这个主题比一开始看起来更加深入,但只要您相信您的用户是非恶意的,实际解决方案就是直截了当的。
Lua 5.2 通过用
load()
的一个新参数代替setfenv()
改变了一些东西。详细信息也在维基页面中。