copia profunda de lua

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"
- }

 

Supongo que te gusta

Origin blog.csdn.net/woodengm/article/details/109767444
Recomendado
Clasificación