Lua面向对象的对象ID不会递增

时间:2014-07-18 19:09:39

标签: oop lua love2d

我试图为LOVE创建一个会给自己ID的对象。基本上,每次我创建这个对象时,它的self.id应该增加1。但是,如果我连续创建了5个新对象,那么ID将为4(因为它从0开始)。

但是,如果我创建我的对象然后手动更改ID,它会正确保存并且该对象不再被绑定"对于idcounter。

entities = {}
idcounter = 0

Entity = {id = -1, test=0}
function Entity:new(o)
    o = o or {}
    setmetatable(o, self)
    self.__index = self
    self.id = idcounter
    idcounter = idcounter + 1
    entities[idcounter] = self
    return o
end

function Entity:GetID()
    return self.id
end

function Entity:SetTest(v)
    self.test = v
end

function Entity:GetTest()
    return self.test
end

test = Entity:new()
test2 = Entity:new()

print(test:GetID())
print(test2:GetID())
test.id = 10
print(test:GetID())
print(test2:GetID())
for k,v in pairs(entities) do
    print(test)
end
test3 = Entity:new()
print(test:GetID())
print(test2:GetID())
for k,v in pairs(entities) do
    print(test)
end

打印

1
1
10
1
table: 00789020
table: 00789020
10
2
table: 00789020
table: 00789020
table: 00789020
由于我希望能够遍历我所做的所有实体的数组,但是它们似乎都指向了同一个实体。表格部分特别令人沮丧。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

第一个问题是self方法中new()的含义。这实际上是指Entity metatable而不是您正在创建的对象。因此,当您设置self.id时,您将设置等效的类字段而不是对象字段。

要解决此问题,您需要更改此设置以将o.id设置为计数器,然后每个对象将获得不同的ID。顺便说一下,test.id = 10工作时发生的事情是你将对象的id设置为10,这会覆盖metatable的。

第二点是关于entities表。 Lua喜欢将表作为1索引数组或字典。通过索引0和覆盖索引,你可以在它之间做一些事情,所以不太可能做你想要的。我的建议是将entity列表与对象的id分开,以便您始终能够将entities作为数组遍历。缺点是您无法使用entities[id]等代码来检索具有该ID的对象。

从代码角度来看:

function Entity:new(o)
    o = o or {}
    setmetatable(o, self)
    self.__index = self
    o.id = idcounter
    o.test = "test "..idcounter
    idcounter = idcounter + 1
    entities[#entities+1] = o
    return o
end

for k,v in ipairs(entities) do
    print(v.test)
end