1.什么是深拷贝?
在Lua中,使用赋值运算符"="进行拷贝的时候,分两种情况:
1.string、number、boolean这些基本类型,会进行复制,会创建一个新对象,拷贝出来的对象和原来的互不影响
此处的打印结果,足以进行说明
2.table类型,是直接进行的引用,拷贝出来的对象和原来是一个对象,改一处另一处也会变化
此处的打印结果,足以进行说明
因此,一般我们提到Lua中的深拷贝,一般都是希望对table类型的变量实现深拷贝。即拷贝后的内容变化,不会影响原来的内容。
而Lua中并没有提供这样的api,因此我们一般会自己封装一个函数。
2.如何进行深拷贝?
进行table深拷贝整体的封装思路就是递归地遍历表的每一个元素,并且在遇到子表时,对子表也进行深拷贝。这样可以确保拷贝后的新表与原表完全独立,任何对新表的修改都不会影响到原表。
上代码:
此时的打印结果为
说明深拷贝成功!
其中不太好理解的代码为
我们举个例子来理解这里的代码
对于键a,值{1,2,3},调用_copy(a)返回a本身,调用_copy({1,2,3})会递归的创建一个新表{1,2,3}
对于键b,值"string",调用_copy(b)返回b本身,调用_copy("string")会返回"string"
对于键c,值"42,调用_copy(c)返回c本身,调用_copy(42)会返回42
对于键d,值{x=1,y=2},调用_copy(d)返回d本身,调用_copy({x=1,y=2})会递归的创建一个新表{x=1,y=2}
每次递归调用_copy函数时,都会对原表中的键和值进行深拷贝,并将结果插入到新表"new_table"中。这样就确保了新表和原表之间完全独立