2012-03-19 99 views
0

我想修改一個可變參數函數內的數組的集合。嘗試添加到陣列時,我最終會在副本上工作,並在通話後迷路。有沒有什麼方法可以通過Lua中的ref傳遞值?lua修改函數內部的數組

function myfunc(...) 
local args = {...} 
--do work on args-- 
end 

「做功」實際上並沒有做任何事情,只是它在功能之外工作得很好。

很顯然,我可以傳遞一個數組的數組,而不是用......但是這有點兒違背了使用的目的...

回答

2

在Lua中,你不能只選擇參照或不傳遞變量。基本類型永遠不會被引用傳遞(如數字和布爾值),其他類型總是通過引用傳遞(如表,用戶數據和字符串)。在字符串的情況下,這並不重要,因爲它們無論如何都是不可變的。

因此,無論你通過你的論點,你要爲這樣的字符串全局工作:

a=2 
b=3 
function myfunc(...) 
    local args={...} 
    for k,v in pairs(args) do 
     _G[v]=_G[v]+k 
    end 
end 
myfunc('a') 
print(a) -- 3 
myfunc('a','b') 
print(a,b) -- 4 5 

注意,在全局這隻作品,因爲當地人不保留在表中。

使用表讓這樣的事情痛苦少:

function myfunc(t) 
    for k,v in pairs(t) do 
      t[k]=v+k 
    end 
end 
tab1={a=2} 
myfunc(tab1) 
print(tab1.a) -- 3 
tab2={a=2,b=3} 
myfunc(tab2) 
print(tab2.a,tab2.b) -- 3 5 
0

在一個varible使用......被分組整個參數列表的目的。這與參數的按參考性質或按價值性質無關。

Lua中的所有自然類型都是按值傳遞的,表是唯一的例外。

做你想做的事情最簡單的方法就是傳遞一個數組數組。如果這兩個多餘的字符看起來太多打字,知道你可以刪除括號來代替:

foo({a,b,c}) 
foo{a,b,c} -- equivalent 
+1

'用表是唯一exception.'從技術上講,一個表的值* *是它的參考。表格的*內容*與表格的值是分開的。 – 2012-03-19 22:17:42