将全局环境设为只读(Lua)
2011-8-22 10:18:22
收藏:0
阅读:116
评论:2
我嵌入了Lua,并想让脚本能够读取全局表,但不能自动写入它,这样两个脚本就可以使用相同的变量名称而不互相覆盖,但仍然可以向全局表中添加内容。我无法更好地解释它:
脚本1
var1 = "foo"
_G.var2 = "bar"
脚本2
print(var1) -- 打印nil
print(var2) -- 打印'bar'
我尝试通过像这样做来实现它('scripts'是一个函数)
newScript = function(content)
Script = loadstring(content)()
env = setmetatable({},{__index = _G})
setfenv(Script,env)
return Script
end
我的Lua绑定是LuaJ,为了在此处提供所有信息,这里是该代码:
private LuaValue newScript(String content){
LuaTable envMt = new LuaTable();
envMt.set(INDEX, _G);
LuaTable env = new LuaTable();
env.setmetatable(envMt);
LuaClosure func = (LuaClosure) _G.get("loadstring").call(valueOf(content));
thread = new LuaThread(func,env);
thread.resume(NIL);
return thread;
}
原文链接 https://stackoverflow.com/questions/7145984
点赞
stackoverflow用户596285
以下是我用来返回只读表的函数:
function ro_table (t)
local t = t
if t then
return setmetatable({},
{ __index=t,
__newindex= function(_,_,_) error ("Attempt to modify read-only table") end,
})
else
return nil
end
end
那么对于你的代码,你可以这样做:
newScript = function(content)
Script = loadstring(content)()
setfenv(Script,ro_table(_G))
return Script
end
请注意,这不会递归地起作用,因此如果您有任何定义为全局的表(或甚至是任何内置函数),则其内容可以被更改,但表本身不可被替换。
2011-08-22 11:52:42
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在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 模式将字符串(嵌套数组)转换为真正的数组?
你想要改变的并不是
__index
,而是__newindex
。另外,你不能使用__index
来捕获访问表中已存在的键。使表在所有情况下只读的唯一方法是将所有读取延迟到代理表并在写入时抛出一个错误。