Love 2D(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

我试图用LUA和Love2D打湿我的脚,但我在LUA中的对象实例化/访问方面遇到了问题

可在此处找到该错误的来源:

我在我的主要,我创造了一个对象,敌人

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
。我假设您希望
计时器
成为
敌人
类的成员,但可能不是?也许你可以分享一个你打算如何使用这个类的小例子。