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