Lua错误尝试索引全局nil值

问题描述 投票:2回答:1

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

这个错误的原因是什么?

lua corona lua-table
1个回答
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'(零值)。

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

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

就像是

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

为索引本地零值b会给你一个错误,因为这里b的范围是本地的。

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

© www.soinside.com 2019 - 2024. All rights reserved.