LUAテーブルのクローニング方法のまとめ
3601 ワード
luaテーブルクローン
luaのテーブルを、独立した別のテーブルにクローンします.
1つのmoduleの場合、requireの後に取得されたテーブルオブジェクトは、luaキャッシュなどの直接変更できませんが、複数回の論理実行では元のmoduleが使用されます.
この場合はcloneを使用する必要があります.
cloneインスタンスは、例えば{1}を{1}クローン化し、
TOstringを使用して2つのテーブルを印刷すると、アドレスが異なることがわかります.
浅い、深いコピー方法をサポート
深いコピー、すなわち、テーブルのkeyまたはvalueがテーブルである場合、テーブルもコピーします.そうしないとコピーしません.そうしないと、浅いコピーになります.
文字列や数値、ブール値などの一般的なデータ型は、コピー後に独立してコピーされます.
LUACIが与える方法
共有リンクの深いコピー方法をサポート
1つのテーブルのkeyとvalueは、複数であり、これらのリンク、参照されたテーブル、共有動作がある場合、前のメソッドを使用すると、2つの異なるアドレスのテーブルがコピーされ、テーブルの内容が一致します.
これは望ましくない.
例えばa={1},b={["aa"]=a,["bb"]=a}
オープンソースソフトウェアプラットフォームはクラス解法を与える
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