Lua Table表的深度拷貝
阿新 • • 發佈:2019-02-15
function table.deepcopy(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 index, value in pairs(object) do
new_table[_copy(index)] = _copy(value)
end
return setmetatable(new_table, getmetatable(object))
end
return _copy(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 index, value in pairs(object) do
new_table[_copy(index)] = _copy(value)
end
return setmetatable(new_table, getmetatable(object))
end
return _copy(object)
end
-- for CCLuaEngine traceback function __G__TRACKBACK__(msg) print("----------------------------------------") print("LUA ERROR: " .. tostring(msg) .. "\n") print(debug.traceback()) print("----------------------------------------") end function main() --一個表型別的變數,這裡模擬的是一個名為table的類,類中有四個屬性 local Table = { array = {}; number= 0; } function table.deepcopy(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 index, value in pairs(object) do new_table[_copy(index)] = _copy(value) end return setmetatable(new_table, getmetatable(object)) end return _copy(object) end --重定義元素的索引 Table.__index=Table --建構函式,new是自定義的名字 function Table.new(num, x,y) local self ={} --初始化self setmetatable(self,Table) --將self的元表設定為Class self.number = num; local tb = {x, y}; self.array = table.deepcopy(tb); return self --返回自身 end function Table:test() print("num:" .. self.number.."x:" .. self.array[1] .. "y:" .. self.array[2]) end --建立兩個物件 local object1=Table.new(100, 10,2) local object2=Table.new(200, 9,3) --利用物件訪問函式及屬性 object1:test() object2:test() end xpcall(main, __G__TRACKBACK__)