lua 的 “传值” 与 “传引用”(亦称 “传址”)
发布时间:2020-12-14 21:43:00 所属栏目:大数据 来源:网络整理
导读:在lua中除了table是引用传递外,其余基本都是值传递。所以当你直接打印一个table的时候,看到的是一个指针类型的数据。 一方面,不能通过简单的 “ = ”来copy一个表,因为这样传过去的还是它自身的引用(地址),必须通过额外写一个方法来实现table的复制;
在lua中除了table是引用传递外,其余基本都是值传递。所以当你直接打印一个table的时候,看到的是一个指针类型的数据。一方面,不能通过简单的 “ = ”来copy一个表,因为这样传过去的还是它自身的引用(地址),必须通过额外写一个方法来实现table的复制;另一方面,通过函数return返回的table类型数据,也是返回的引用,如果希望通过只读的方式拿到数据,则应在拿到后进行一下copy的操作,然后再对副本进行修改;而对于除table外的其它常见数据类型,则基本都是传值的方式,下面以函数为例:? function fun_1()?? ?print("第一个函数")?? end? ? ? function?fun_2()?? ?print("第二个函数")?? end?? ? x?= fun_1?? y?=?x?? x?=?fun_2?? y()?? x()?? 输出:第一个函数? ? ? ?-- 修改x对y没有产生影响,可见是 “值传递” 的方式。 ? ? ? 第二个函数?? ? 下面举一个实现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
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |