zoukankan      html  css  js  c++  java
  • lua 的 “传值” 与 “传引用”(亦称 “传址”)

    在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
  • 相关阅读:
    Cocos2d-X 精灵、动作效果
    android动画介绍之 自己定义Animation动画实现qq抖一抖效果
    C#将dataGridView中显示的数据导出到Excel(大数据量超有用版)
    Redis深入之对象
    【POJ 3694】 Network(割边<桥>+LCA)
    Swift学习笔记(十四)——字符,常量字符串与变量字符串
    关于tomcat session机制梳理
    【机器学习算法-python实现】採样算法的简单实现
    分公司=一部门——组合模式
    临渊慕鱼,不如退而结网!
  • 原文地址:https://www.cnblogs.com/rollingyouandme/p/11728235.html
Copyright © 2011-2022 走看看