识别表格/变量的变化。
2012-1-31 3:34:25
收藏:0
阅读:143
评论:2
我有几个表/变量(下面是样本):
mytable = { ['100'] = { ['2']=0,['3']=0,['5']=0,['6']=0,['7']=0,['9']=0},
['101'] = { ['8']={['81']=0,['86']=0},
['13']={['81']=0},
['30']={['81']=0,['82']=0,['83']=0,['84']=0,['85']=0} },
['102'] = { ['81']={['location']='left',['3']=1} }
}
mytable2 = 5
我需要一个函数来传递一个结构如上述两个之一的表/变量(可以是任何一个),它将区分当前数据和先前数据,并返回一个仅包含上次每个客户端调用后发生变化的数据的表/变量(与表/变量一起传递的唯一ID)。在函数执行之间,表格可以增长或更改。
因此,如果在函数执行之间发生以下更新:
mytable['101']['8']['81']=1
mytable['102']['81']['4']=0
该函数将返回
mytable = { ['101'] = { ['8']={['81']=1} },
['102'] = { ['81']={['4']=0} }
}
原文链接 https://stackoverflow.com/questions/9071459
点赞
stackoverflow用户88888888
虽然这会增加空键,但我认为这对我有效:
-- t 是表, pt 是上一个表
function deepchange(t,pt)
if (pt == nil) then return t, true end
if type(t) ~= 'table' then return t, t ~= pt end
local res = {}
local sd = false
for k, v in pairs(t) do
if type(v) == 'table' then v = deepchange(v, pt[k]) end
if pt ~= nil and pt[k] ~= v or pt == nil then
res[k] = v
sd = true
end
end
return res, sd
end
更新以处理第二种情况和删除与获取和设置元表有关的不必要行...
再次更新以处理 null 的先前表。
2012-02-01 04:58:17
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在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中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
关于 Lua 表格有一个需要注意的问题:表格是通过引用传递的(除非进行深拷贝)。因此,如果你这样做:
A={1,2,3} B=A B[1]=nil --[[then]] print(A[1]==nil)-- 输出 true。
因此,拥有“新表格”和“旧表格”需要您额外付出一些努力。 要么对表格进行深拷贝以获取引用(不占用位置)。 要么您不直接更改表格本身,而是使用代理。这仅针对单层表格有效,但我认为您可以在代理表格中嵌入结构,并在真实表格中保存值:
mytable={} do local changes={} mt={ __index=function(t,k) if k=="reset" then return function() changes={} return true end elseif k=="getChanges" then return function() return changes end else return mytable[k] end end, __newindex=function(t,k,v) changes[k]=v mytable[k]=v end } prox=setmetatable({},mt) end prox[1]=1 prox[2]=2 for k,v in pairs(prox:getChanges()) do print(k,v) end prox:reset() for k,v in pairs(prox:getChanges()) do print(k,v) end
递归实现可能需要一些工作。我想您应该考虑一个问题:编写一个简单的函数来记录表格的交易是否会更简单。