Lua 尝试索引全局 nil 值时出错

Lua error attempt to index global nil value

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

我收到这条消息:

这个错误的原因是什么?

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

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

您正试图索引名为 TerrGrass_mt 的 table。但是你定义的table被命名为TerrBase_mt.

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

我们来看看错误信息:

main.lua 12: attempt to index global 'TerrGrass_mt' (a nil value).

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

您试图对名为 TerrGrass_mt 的全局索引(使用索引运算符 .)。这告诉你问题是 TerrGrass_mt.TerrGrass_mt 是零。

类似

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

索引本地 nil 值时会出错 b 因为这里 b 的作用域是本地的。

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