【问题标题】:How to remove a variable from child script environment in lua?如何从 lua 的子脚本环境中删除变量?
【发布时间】:2017-10-06 12:55:14
【问题描述】:

我有一个脚本,我用loadfile 加载然后运行它。另外我在父lua脚本的范围内有变量love,我希望这个变量在子脚本环境中是nil,但其他所有内容都保持不变(printmathpairs,所有标准库卢阿)。我该怎么做?

这不起作用:

local scenario = love.filesystem.load(script)
local env = {}
setmetatable(env, { __index = _G })
env.love = nil
env.game = Game
setfenv(scenario, env)

【问题讨论】:

    标签: lua love2d lua-5.1


    【解决方案1】:
    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)
    

    【讨论】:

    • 请注意setfenv was removed in Lua 5.2
    • @ComicSansMS - 这个问题是关于 Lua 5.1,因为作者在他的代码中使用了这个函数(也看看这个作者的上一个问题)。
    • @EgorSkriptunoff 同意,我只是添加了评论,以防将来有人偶然发现这个问题并想知道为什么你的答案对他们不起作用。
    • @ComicSansMS - 我在问题中添加了“Lua 5.1”标签以避免可能的误解(实际上,这个问题是关于在 Lua5.1 上运行的 Love2D)
    【解决方案2】:

    您的代码不起作用,因为env 继承自_G,因此env.love_G 中解析。设置env.love = nil 不会将love 条目添加到env

    设置env.love = falseenv.love = {}

    【讨论】:

    • 为什么设置为nil不添加呢?
    • 设置为 nil 会删除表中的条目。
    • 但它没有 - 子脚本仍然可以在其范围内使用love
    • env.love 已经是nil 之前env.love = nil 执行,所以该行不做任何事情。当您访问env.love 时,__index 元方法被精确调用因为env.love 的真实值是nil;这正是手册指定的行为。
    猜你喜欢
    • 2010-09-23
    • 1970-01-01
    • 2011-03-05
    • 2016-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多