如何从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)