在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
在lua中除了 table是引用传递 外,其余基本都是值传递。所以当你直接打印一个table的时候,看到的是一个指针类型的数据。这就导致如下问题:1,不能通过简单的 “ = ”来copy一个表,因为这样传过去的还是它自身的引用(地址),必须通过额外写一个方法来实现table的复制(见例3);2,通过 函数return返回的table类型数据,也是返回的引用,如果希望通过只读的方式拿到数据,则应在拿到后进行一下copy的操作,然后再对副本进行修改;3,函数传参时,如果传进去一个table,那么你在函数内部对这个形参table的修改,都会导致函数外面那个实参table也跟着改变;而对于除table外的其它常见数据类型,则基本都是传值的方式,下面以函数为例:例1.function fun_1() print("第一个函数") end
function fun_2() print("第二个函数") end
x = fun_1 y = x x = fun_2 y() x() 输出:第一个函数 -- 修改x对y没有产生影响,可见是 “值传递” 的方式。 第二个函数
例2.
local mytab = { a=1,b="s"}
local function haha(tab)
tab.a=2
tab.b=2
end
haha(mytab)
print(mytab.a)
print(mytab.b)
输出是:2 2
可见,形参table在函数内部的改变会导致实参table也跟着改变; 另外也可见lua中的变量不分类型,只有数据分类型:一开始 b 是个字符串,后来改为一个数字。
例3. 下面举一个实现copy table的例子:
function cloneTable(tab) -- 功能:克隆一份table
local function copy(target, res)
for k,v in pairs(target) do
if type(v) ~= "table" then
res[k] = v;
else
res[k] = {};
copy(v, res[k]) -- 递归
end
end
end
local result = {}
copy(tab, result)
return result
end
例4:
补充:深度克隆一个值:
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
00
|
请发表评论