LUAテーブルのクローニング方法のまとめ

3601 ワード

luaテーブルクローン
luaのテーブルを、独立した別のテーブルにクローンします.
1つのmoduleの場合、requireの後に取得されたテーブルオブジェクトは、luaキャッシュなどの直接変更できませんが、複数回の論理実行では元のmoduleが使用されます.
この場合はcloneを使用する必要があります.
cloneインスタンスは、例えば{1}を{1}クローン化し、
TOstringを使用して2つのテーブルを印刷すると、アドレスが異なることがわかります.
 
浅い、深いコピー方法をサポート
深いコピー、すなわち、テーブルのkeyまたはvalueがテーブルである場合、テーブルもコピーします.そうしないとコピーしません.そうしないと、浅いコピーになります.
文字列や数値、ブール値などの一般的なデータ型は、コピー後に独立してコピーされます.
 
LUACIが与える方法
---------------------

--- Clones the given object and return it's copy.

-- @param object Table value to clone

-- @param deep Boolean indicating whether to do recursive cloning

-- @return Cloned table value


function clone(object, deep)

    local copy = {}


    for k, v in pairs(object) do

        if deep and type(v) == "table" then

            v = clone(v, deep)

        end

        copy[k] = v

    end


    return setmetatable(copy, getmetatable(object))

end

 
 
共有リンクの深いコピー方法をサポート
 
1つのテーブルのkeyとvalueは、複数であり、これらのリンク、参照されたテーブル、共有動作がある場合、前のメソッドを使用すると、2つの異なるアドレスのテーブルがコピーされ、テーブルの内容が一致します.
これは望ましくない.
例えばa={1},b={["aa"]=a,["bb"]=a}
 
オープンソースソフトウェアプラットフォームはクラス解法を与える
-[[

Function: cocos2dx_clone

Description: lua     ,cocos2dx      。    :   。

                  :

            http://blog.csdn.net/u013174689/article/details/41959011

Parm: object(object):     lua  。

return:     lua  。

]]

function cocos2dx_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)

            print(key,value)--    print            

        end

        return setmetatable(new_table, getmetatable(object))

    end

    return _copy(object)--  clone   object   /  

end