Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop Lua面向对象对象id don';t增量_Oop_Lua_Love2d - Fatal编程技术网

Oop Lua面向对象对象id don';t增量

Oop Lua面向对象对象id don';t增量,oop,lua,love2d,Oop,Lua,Love2d,我试图为爱创造一个对象,它会给自己一个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,

我试图为爱创造一个对象,它会给自己一个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
其中的表部分尤其令人沮丧,因为我希望能够遍历我创建的所有实体的数组,但它们似乎都指向同一个实体


我做错了什么?

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

要纠正这一点,您需要将其更改为将
o.id
设置为计数器,然后每个对象将获得不同的id。顺便说一句,当
test.id=10
工作时发生的情况是,您将对象的
id
设置为10,从而覆盖了元表的id

第二点与
实体
表有关。Lua喜欢表是单索引数组或字典。通过从0建立索引并覆盖索引,您正在使它在这两者之间做一些事情,因此它不太可能做您想要做的事情。我的建议是将
实体
列表从对象的
id
中分离出来,以便您始终能够作为数组遍历
实体。缺点是,您将无法执行诸如
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

您正在打印循环中
test
的值。不是
v
的值,该值是当前循环条目的实体<代码>对
也不能保证遍历顺序。您还在
:new()
函数中设置
实体.id
,而不是您创建的实体
o.id
。哇!第一点我感到非常尴尬。让我直说第二部分:自我和实体是一样的吗?将self.id更改为o.id会修复第一部分,但将循环中的打印更改为
print(tostring(v)“…v:GetID())
会使它们打印相同的表代码和-1。哦,修复了它。我还有
实体[idcounter]=self
,正如你指出的,self是不对的。多谢各位
self
是函数的第一个(当函数使用
语法定义时隐式)参数。调用
实体:new()
(与
实体相同。new(实体)
)时,
self
实体
。调用
test:GetId()
时,
self
test