码迷,mamicode.com
首页 > 其他好文 > 详细

lua 的 “传值” 与 “传引用”(亦称 “传址”)

时间:2019-10-23 20:20:54      阅读:104      评论:0      收藏:0      [点我收藏+]

标签:其它   第一个   引用传递   影响   ble   复制   额外   copy   直接   

在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

lua 的 “传值” 与 “传引用”(亦称 “传址”)

标签:其它   第一个   引用传递   影响   ble   复制   额外   copy   直接   

原文地址:https://www.cnblogs.com/rollingyouandme/p/11728235.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!