加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读