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的话,就传递的还是引用了吧...
相关文章推荐
- Lua 解释器
- lua堆栈内存不足的相关网站
- lua调用java java调用lua
- LUA取整
- Lua_第28章 资源管理(下)
- Lua_第28章 资源管理(上)
- 如何判断lua是不是一个纯数组类的table
- lua方便之处
- lua 默认参数
- lua中的用require不会循环引用
- Lua动画
- lua
- Lua从入门到放弃--异常处理
- lua语言-string.gsub
- LeetCode|Evaluate Reverse Polish Notation
- LeetCode-150.Evaluate Reverse Polish Notation
- Lua编程基础
- Lua io和字符串函数基础
- lua 可变参数
- lua-oc-java相互调用