【问题标题】:Lua error attempt to index global nil valueLua 错误尝试索引全局 nil 值
【发布时间】:2019-08-21 20:20:37
【问题描述】:

对于使用 CoronaSDK 的游戏,我正在尝试在 Lua 中实现一些 OOP。

如果我在 Corona 模拟器中运行以下代码:

-- Terrain Sprites base

local TerrBase = {}
local TerrBase_mt = {_index = TerrBase}

function TerrGrass_mt.baseAdd(a,b)
    print(a+b)
end



-- Terrain Sprites - Grass

local TerrGrass = {}

function TerrGrass.new()
    local grass = {}
    setmetatable(grass,TerrBase_mt)
    return grass
end

function TerrGrass.add(a,b)
    print(a+b)
end

function TerrGrass.sub(a,b)
    print(a-b)
end

function TerrGrass.mul(a,b)
    print(a*b)
end

function TerrGrass.div(a,b)
    print(a/b)
end

--

local grass = TerrGrass.new()

grass.add(5,7)

我收到这条消息:

这个错误的原因是什么?

【问题讨论】:

    标签: lua coronasdk lua-table


    【解决方案1】:
    local TerrBase = {}
    local TerrBase_mt = {_index = TerrBase}
    
    function TerrGrass_mt.baseAdd(a,b)  -- <---- ERROR
        print(a+b)
    end
    

    您正在尝试为名为 TerrGrass_mt 的表建立索引。但是您定义的表名为TerrBase_mt

    TerrGrass_mtnil 值,因此会出现错误。

    我们来看看错误信息:

    main.lua 12:尝试索引全局 'TerrGrass_mt'(一个 nil 值)。

    这告诉你错误发生在文件 main.lua 的第 12 行。

    您尝试在名为 TerrGrass_mt 的全局上建立索引(使用索引运算符 .)。这告诉您问题是TerrGrass_mt.,而TerrGrass_mt 为零。

    类似

    function a(b) c = b.d end
    a()
    

    在索引本地 nil 值 b 时会出错,因为这里 b 的范围是本地的。

    每当您在以任何方式使用 nil 值时遇到错误时,您都必须找出为什么该值是 nil 并修复它,或者在某些情况下将其替换为默认值。

    【讨论】:

    • 感谢您的详细回复!我用谷歌搜索了更多,找到了一个很好的 Lua 教程,我开始工作了。我将 4 个 Lua 脚本中的工作代码编辑/添加到 OP。我非常感谢您的回复,并接受它作为答案。再次感谢:-)
    • @Locohost 你的问题是错字。添加不同的代码作为解决方法对任何人都没有帮助。
    • 您删除了所有重要信息(主要是格式正确且正常工作的 OOP 代码!)并将此帖子编辑至死。这甚至不再是我的帖子了。
    • @Locohost 好吧,我删除了与您需要帮助的问题无关的任何内容。您的问题不是如何在 Lua 中实现 OOP,而是为什么您会收到该错误消息以及您做错了什么。那个问题仍然存在,你的错误代码也是如此。请阅读How to Ask。一切都是为了专注!我并不是要根据指南改进您的帖子来伤害您的感受。下一个面临该错误的人并不关心您使用 Lua 多久、您了解多少 JavaScript 或如何在 Lua 中实现 OOP。他们想要索引全局 nil 值的示例。
    猜你喜欢
    • 2021-08-04
    • 2019-03-01
    • 1970-01-01
    • 2014-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多