自己实现的深拷贝

下面是一份 Lua 版本的深拷贝实现。通过一个 lookup 表记录已经拷贝过的对象,从而解决循环引用带来的无限递归问题,同时保留原表的 metatable。

--- 深拷贝对象
                -- @param srcObj 对象
                local function deepCopy(srcObj)
                    --- 已被拷贝的对象列表(解决循环引用的问题)
                    local lookup = { }
                
                    local function _copy(object)
                        if type(object) ~= "table" then
                            return object
                        elseif lookup[object] then
                            return lookup[object]
                        end
                
                        local newTable = { }
                        lookup[object] = newTable
                
                        for k, v in pairs(object) do
                            newTable[_copy(k)] = _copy(v)
                        end
                
                        return setmetatable(newTable, getmetatable(object))
                    end
                
                    return _copy(srcObj)
                end

cocos2d 提供的版本

cocos2d 提供了一份功能等价的实现,思路和上面的版本完全一致,只是命名习惯略有不同。

function clone(object)
                    local lookup_table = {}
                    local function _copy(object)
                        if type(object) ~= "table" then
                            return object
                        elseif lookup_table[object] then
                            return lookup_table[object]
                        end
                        local new_table = {}
                        lookup_table[object] = new_table
                        for key, value in pairs(object) do
                            new_table[_copy(key)] = _copy(value)
                        end
                        return setmetatable(new_table, getmetatable(object))
                    end
                    return _copy(object)
                end