【发布时间】:2014-09-10 00:17:41
【问题描述】:
我正在尝试为 LOVE 创建一个对象,该对象将为自己提供自己的 ID。基本上,每次我创建这个对象时,它的 self.id 都应该加一。但是,如果我连续创建 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
其中的表格部分特别令人沮丧,因为我希望能够遍历我制作的所有实体的数组,但它们似乎都指向同一个实体。
我做错了什么?
【问题讨论】:
-
您正在循环中打印出
test的值。不是v的值,它是当前循环条目的实体。pairs也不保证遍历顺序。 -
您还在
:new()函数中设置Entities.id,而不是您创建的实体o.id。 -
哇哦!我对第一个数字感到非常尴尬。让我直接说第二部分:self 和 Entity 一样吗?将 self.id 更改为 o.id 修复了第一部分,但将循环中的打印更改为
print(tostring(v) .. " " .. v:GetID())会使它们打印相同的表格代码和 -1。 -
哦,修好了。我也有
entities[idcounter] = self,正如你所指出的,self 是不对的。非常感谢! -
self是函数的第一个参数(当函数使用:语法定义时为隐式)。当调用Entity:new()(与Entity.new(Entity)相同)时,self是Entity。当调用test:GetId()时,self是test。