对于使用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
的表。但是您定义的表名为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的原因并修复该值或在某些情况下将其替换为默认值。