Lua错误尝试索引全局nil值

时间:2019-03-31 14:41:55

标签: lua corona lua-table

对于使用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)

我收到此消息:

enter image description here

此错误的原因是什么?

1 个答案:

答案 0 :(得分:1)

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

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

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

TerrGrass_mt是一个nil值,因此是错误。

让我们看看错误消息:

  

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并进行修复或在某些情况下将其替换为默认值。