我从“编程在Lua”由罗伯托·萨利姆斯学习,我发现,在本书中,沙箱的示例使用功能setfenv()
来改变一个给定函数的环境,但在Lua 5.2这一功能不再可用。
我试图从一个文件中的一些的值(配置文件)加载到一个场中的表,但是,在LUA 5.2我不能使用setfenv(这样我就可以在给定的环境中加载的值)。 阅读LUA 5.2的一些文章后,我发现,每个函数可以有(或没有)呼吁_ENV一个的upvalue充当环境,所以,我想下面的代码:
function sandbox(sb_func, sb_env)
if not sb_func then return nil, "sandbox function not valid" end
sb_orig_env = _ENV
_ENV = sb_env -- yes, replaces the global _ENV
pcall_res, message = pcall( sb_func )
local modified_env = _ENV -- gets the environment that was used in the pcall( sb_func )
_ENV = sb_orig_env
return true, modified_env
end
function readFile(filename)
code = loadfile(filename)
res, table = sandbox(code, {})
if res then
--[[ Use table (modified_env) ]]--
else
print("Code not valid")
end
更换_ENV
在“沙箱”功能的效果很好(不能访问常规字段),但是,当“代码”执行它似乎忽略了我取代_ENV
,它仍然可以访问常规领域(印刷,使用loadFile, dofile处理等)。
读书多一点,我发现,LUA 5.2提供了一个函数用于此目的,该功能loadin(env, chunk)
,它运行在给定的环境中定块,但是,当我尝试这个功能添加到我的代码,不存在的功能(没有出现在全球_G
场)。
一些帮助将不胜感激。