如何从lua中的子脚本环境中删除变量?
我有一个脚本,我用如何从lua中的子脚本环境中删除变量?,lua,love2d,lua-5.1,Lua,Love2d,Lua 5.1,我有一个脚本,我用loadfile加载它,然后运行它。另外,我在父lua脚本的范围内有变量love,我希望这个变量在子脚本enivornment中是nil,但其他所有内容都不被触及(print,math,pairs,所有lua的std lib)。我该怎么做 这不起作用: local scenario = love.filesystem.load(script) local env = {} setmetatable(env, { __index = _G }) env.love = nil en
loadfile
加载它,然后运行它。另外,我在父lua脚本的范围内有变量love
,我希望这个变量在子脚本enivornment中是nil
,但其他所有内容都不被触及(print
,math
,pairs
,所有lua的std lib)。我该怎么做
这不起作用:
local scenario = love.filesystem.load(script)
local env = {}
setmetatable(env, { __index = _G })
env.love = nil
env.game = Game
setfenv(scenario, env)
您的代码不工作,因为
env
继承自\u G
,因此env.love
在\u G
中解析。设置env.love=nil
不会将love
条目添加到env
设置
env.love=false
或env.love={}
注意setfenv
@comicsanss-这个问题是关于Lua5.1的,因为作者在他的代码中使用了这个函数(也可以查看作者之前的问题)。@EgorSkriptunoff同意,我只是添加了评论,以防将来有人无意中发现这个问题,并想知道为什么你的答案对他们不起作用。@ComicSansMS-我在问题中添加了“Lua 5.1”标记以避免可能的误解(实际上,这个问题是关于Love2D在Lua5.1上的工作)为什么将其设置为nil
不会添加它?设置为nil
会删除表中的一个条目。但是它不会-子脚本仍然可以在其作用域中使用love
。env.love
在执行行env.love=nil
之前已经nil
,因此该行不做任何事情。当您访问env.love
时,会调用\uu index
元方法,因为env.love
的真实值为nil
;这正是手册规定的行为。
local scenario = love.filesystem.load(script)
local env = setmetatable({}, { __index =
function(t, k)
if k == "love" then
return nil
else
return _G[k]
end
end
})
setfenv(scenario, env)