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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM