Operaciones de cesión en lua
En Lua, si asigna directamente el tipo de datos básico (excepto cadena y tabla) a una variable, se realizará una operación de copia. La cadena y la tabla se asignan por referencia. La cadena no se puede modificar, y cada asignación y enlace forman una nueva Las cadenas se almacenan en un área fija, y las variables de cadena solo tienen sus referencias. Todas estas operaciones de asignación son copias superficiales, solo asignaciones o referencias. Cuando necesitamos copiar todo el contenido de la tabla, asignación pura La operación no es suficiente, necesita realizar una "copia profunda".
Copia profunda de la tabla
El principio de copia profunda es muy simple, es decir, simplemente asigne (copia superficial) los atributos de tipo de datos básicos de la tabla (incluido el tipo de cadena), continúe copiando en profundidad los atributos del tipo de tabla e itere al atributo más interno ., Hasta que se copien todos los atributos, tenga en cuenta que la copia del atributo de tipo de tabla aquí también implica la copia de la metatabla. El siguiente es un ejemplo:
function deepCopy(originObj)
local lookupTable = {}
local _copy
_copy = function(obj)
-- 基础数据类型的属性进行简单赋值操作
if type(obj) ~= "table" then return obj end
-- 表类型的属性进行迭代拷贝
-- 这里的查找表是为了避免重复拷贝
if lookupTable[obj] then return lookupTable[obj] end
local newTable = {}
lookupTable[obj] = newTable
for _k, _v in pairs(obj) do
-- 要考虑key和value为表的情况
newTable[_copy(_k)] = _copy(_v)
end
-- 不要忘记复制元表
return setmetatable(newTable, getmetatable(obj))
end
return _copy(originObj)
end
t = {1, 2, 333, "jdkfj", false, {4, 5, 6, {"hhh", 3}, 1}, 0, "jfdks"}
dump(deepCopy(t))
$ luajit test.lua
- "<var>" = {
- 1 = 1
- 2 = 2
- 3 = 333
- 4 = "jdkfj"
- 5 = false
- 6 = {
- 1 = 4
- 2 = 5
- 3 = 6
- 4 = {
- 1 = "hhh"
- 2 = 3
- }
- 5 = 1
- }
- 7 = 0
- 8 = "jfdks"
- }