您的位置:首页 > 编程语言 > Lua

lua深度克隆的实现(lua基本数据类型传的是值,表类型传的是引用)

2016-05-06 11:19 561 查看
local function main()
require "src/boot/Bootstrap"
BootStrap:boot( )

local value = "old"
cclog("OLD:"..value)
f(value)
cclog("NEW:"..value)
end

function f(value)
value = "new"
end

输出:

[LUA-print] OLD:old

[LUA-print] NEW:old

总结:基本类型lua是传值

<2>

local function main()
require "src/boot/Bootstrap"
BootStrap:boot( )
--test测试
t1 = {a = "abc", b = "def"}
dump(t1)
f(t1)
dump(t1)
end

function f(t)
t["a"] = nil
end

--[[
[LUA-print] dump from: [string "src/main.lua"]:132: in function <[string "src/main.lua"]:127>
[LUA-print] - "<var>" = {
[LUA-print] -     "a" = "abc"
[LUA-print] -     "b" = "def"
[LUA-print] - }
[LUA-print] dump from: [string "src/main.lua"]:134: in function <[string "src/main.lua"]:127>
[LUA-print] - "<var>" = {
[LUA-print] -     "b" = "def"
[LUA-print] - }
]]
可见,通过f函数修改了表t1

总结:可见lua传表为传的引用,修改一个,会影响另一个表。

<3>深度克隆的实现

function 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)
end
return setmetatable(new_table, getmetatable(object))
end
return _copy(object)
end


当然了,lua中直接用local objCopy = clone(obj),这样就克隆出来个一样的对象了。
总结:不过lua自带clone方法,直接使用就行。

<4>2017-6-29

今天又遇到了一种情况:

local playersTmp = clone(players)

通过playsersTmp中的一个player去修改player:setScore()后,发现原players中的player:getScore并没有改变,但是player:getScoreLabel():getString()这个却改变了。说明,如果里面的对象不是table的话,就传递的还是引用了吧... 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: