在做一个cocos2dx的项目的时候,有大概这么一段代码
self.table1 = {1,2, 3}
self.table2 = self.table
table.remove(self.table2, 3)
大概的意思就是这样,当我第二次回来用到这个table1的时候,我发现第三个数不见了,一脸懵逼,通过多次试验和打印外加高人指点,这就是lua引用容易踩的坑。
简单点说,就是table2是引用的table1,而不是新开辟了一个内存空间,table2就是指向的table1的内存地址,如果删除table2中的元素,那么就是删除掉了内存地址中的元素,也就是table1中的元素被删除了。
下面是一个深拷贝的方法,可以完全开辟一块新的内存空间,来避免因为删除了table2而误删table1中的元素
function copyTable(originTable)
if (originTable == nil or type(originTable) ~= "table") then
return originTable
end
local Ret = {}
for k,v in pairs(originTable) do
local vtype = type(v)
if (vtype == "table") then
Ret[k] = self:copyTable(v)
else
Ret[k] = v
end
end
return Ret
end
在使用的时候,直接调用赋值就是一个深拷贝了
self.table2 = copyTable(self.table1)
网友评论