Lua错误尝试索引全局nil值

对于使用CoronaSDK的游戏,我正在尝试在Lua中实现一些面向对象编程。

如果在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

造成此错误的原因是什么?

点赞
用户2858170
用户2858170
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: attempt to index global 'TerrGrass_mt' (a nil value)。

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

您尝试在名为TerrGrass_mt的全局变量上使用索引运算符.。 这告诉您问题是在TerrGrass_mt,而TerrGrass_mtnil

类似于

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

由于此处b的作用域为局部变量,因此会给您一个错误,指出索引局部nil值b,而b的作用域是局部的。

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

2019-03-31 14:56:20