• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

在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

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
[Lua]Lua高级教程Metatables发布时间:2022-07-22
下一篇:
C++/C#/F#/Java/JS/Lua/Python/Ruby渲染比试发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap