Lua面向对象的对象ID不会递增。
2014-7-18 19:9:39
收藏:0
阅读:67
评论:1
我正在尝试为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
其中表格部分特别让人沮丧,因为我想能够遍历我所做的所有实体数组,但它们似乎都指向同一个实体。
我做错了什么?
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
第一个问题是“new()”方法中“self”的含义。实际上,这指的是实体元表,而不是您创建的对象。因此,当您设置“self.id”时,您设置的是类字段,而不是对象字段。
为了纠正这个问题,您需要将其更改为设置“o.id”为计数器,然后每个对象将获得不同的ID。顺便说一句,“test.id = 10”起作用的情况是,您将对象的“id”设置为10,从而覆盖了元表的内容。
第二个问题涉及“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