对于使用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)
我收到此消息:
此错误的原因是什么?
答案 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并进行修复或在某些情况下将其替换为默认值。