luaのディープコピー

luaでの代入演算

Luaでは、基本データ型(文字列とテーブルを除く)を変数に直接割り当てると、コピー操作が実行されます。文字列とテーブルは参照によって割り当てられます。文字列は変更できず、各割り当てとリンクは新しいものを形成します。文字列は固定領域に格納され、文字列変数はそれらの参照を保持するだけです。これらの割り当て操作はすべて浅いコピーであり、割り当てまたは参照だけです。テーブルのすべての内容をコピーする必要がある場合は、純粋な割り当て操作だけでは不十分です。 「ディープコピー」を実行する必要があります。

テーブルのディープコピー

ディープコピーの原則は非常に単純です。つまり、テーブルの基本的なデータ型属性(文字列型を含む)を割り当て(浅いコピー)、テーブルタイプの属性をディープコピーし続け、最も内側の属性まで繰り返します。 。、すべての属性がコピーされるまで、ここでのテーブルタイプ属性のコピーにはメタテーブルのコピーも含まれることに注意してください。次に例を示します。

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

 

おすすめ

転載: blog.csdn.net/woodengm/article/details/109767444