1. 程式人生 > >Lua Table表的深度拷貝

Lua Table表的深度拷貝

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

-- 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__)