Love 2D(Lua)对象中意外的零
我试图用LUA和Love2D打湿我的脚,但我在LUA中的对象实例化/访问方面遇到了问题 可在此处找到该错误的来源: 我在我的主要,我创造了一个对象,敌人Love 2D(Lua)对象中意外的零,lua,love2d,Lua,Love2d,我试图用LUA和Love2D打湿我的脚,但我在LUA中的对象实例化/访问方面遇到了问题 可在此处找到该错误的来源: 我在我的主要,我创造了一个对象,敌人 enemies = Enemies:new() 在敌人对象的内部,我创建了一个对象来保存peristant值,我称之为计时器 timers = Timers:new() 所以敌人的“构造函数”方法看起来(基本上)是这样的 Enemies = {} -- so that Enemies will not be nil when new() i
enemies = Enemies:new()
在敌人对象的内部,我创建了一个对象来保存peristant值,我称之为计时器
timers = Timers:new()
所以敌人的“构造函数”方法看起来(基本上)是这样的
Enemies = {} -- so that Enemies will not be nil when new() is called
timers = {} -- so that timers will be accessible in the class scope
function Enemies:new(enemies)
enemies = enemies or {}
timers = Timers:new()
setmetatable(enemies, self)
self.__index = self
return enemies
end
而正在创建的计时器看起来就是这样
Timers = {} -- so that Timers will not be nil when new() is called
function Timers:new(timers)
timers = timers or {
miniBombTimerMax = 0.2,
miniBombTimer = minibombTimerMax
}
setmetatable(timers, self)
self.__index = self
return timers
end
但是当我尝试引用其中一个计时器(从敌人对象内部)时,我得到了一个nil值异常
timers.miniBombTimer -- Produces nil exception
在我看来,这两者都应该是1。在作用域中,因为它是在这个类中创建的一个对象,并且在赋值之前在本地实例化为timers={},2。不是零,因为它在“构造函数”中被赋予了一个值。但这里似乎还有更多我没有领会的东西
我不熟悉Lua,这一点在这里可能很明显,但从我所读到的关于变量范围的内容来看,这应该是有效的。我不明白为什么计时器不是用值创建的 小心你的球!在Lua中,当您不想设置全局变量时,很容易意外地设置全局变量,看起来这正是发生的事情
function Enemies:new(enemies)
enemies = enemies or {}
timers = Timers:new()
setmetatable(enemies, self)
self.__index = self
return enemies
end
在这里的第三行,由于timers
在这里不作为局部变量存在,因此该值最终被放入名为timers
的全局变量中。如果要设置敌人
的属性,需要明确提及敌人:
function Enemies:new(enemies)
enemies = enemies or {}
enemies.timers = Timers:new()
setmetatable(enemies, self)
self.__index = self
return enemies
end
现在,你写: 但是当我尝试引用其中一个计时器(从敌人对象内部)时,我得到了一个nil值异常 Lua实际上没有任何“在对象内部”或“在类内部”的概念。在某些语言中,当您在类内编写代码时,类的所有成员都在范围内,您可以将它们称为“裸”。Lua不是这些语言中的一种;在Lua中,如果要引用“类成员”,则需要使用点表示法,明确说明要访问的对象。(也可以使用
\u ENV
执行“高级方法”)
顺便说一下
timers = {} -- so that timers will be accessible in the class scope
从我在问题中看到的情况来看,这句话没什么用;它只是创建了一个从未使用过的全局变量
另外,敌人:新建中的这一行:
self.__index = self
这只是设置敌人。_索引
每次调用敌人:new。这很好,但您也可以只设置一次:
function Enemies:new(enemies)
enemies = enemies or {}
enemies.timers = Timers:new()
setmetatable(enemies, self)
return enemies
end
Enemies.__index = Enemies
通读?您没有显示有问题的代码部分,但可能您没有使用
self
?您的构造函数也没有使用self
。我假设您希望计时器
成为敌人
类的成员,但可能不是?也许你可以分享一个你打算如何使用这个类的小例子。