2016-01-10 31 views
1

我正在使用Lua 5.1.4中的一個腳本,它使用表作爲參數。我的問題是,只要我用table作爲參數調用函數,它實際上會傳遞表的句柄而不是數據。Lua 5.1.4從表(數組)處理數據(不是句柄)到函數

我做了一個簡單的腳本,使我更容易解釋這個...

function test(a) 
    a[2]="not something" 
    return a 
end 

alpha={"hello","something"} 
bravo=test(alpha) 

print(alpha[2]) 
print(bravo[2]) 

回報

不是

不是

從這個例子很明顯,a是一樣的韓dle爲alpha,因此表alpha被更改,但我會以某種方式保留原始值alpha(在此示例中)。

我有一些想法,但它會使功能更大,更慢,所以我想知道如果有一個簡單的方法來做到這一點。重要的是要提到我的桌子不是固定的,而且很大。

回答

2

您將不得不復製表格。這意味着遍歷表格並複製每一個值。

當然,如果這些數值本身的一個是表,那麼你需要做的是表的副本。遞歸。另外,如果其中一個表被引用兩次,則應該引用兩次副本,而不是創建新副本。

如果一個表使用的metatable ......好吧,你不能真正知道如何複製的。您使用pairs進行迭代的值可能不是真正的值。

並且複製功能很困難,因爲它們通常具有需要複製的upvalues,以使該功能的副本具有真實副本。複製用戶數據是不可能而不知道調用哪個C函數來複制它(如果甚至有這樣做的API)。

如果這種操作是一個問題,那麼你應該寫你的函數來避免這個問題,而不是複製表。

做到這一點的方法是把作爲參數不變的表。你可以看,但不要碰。相反,讓函數返回值;這留給呼叫者自行決定在哪裏存儲它們。請注意,self應該排除在外,因爲您可能希望概念成員函數能夠修改其被調用的對象。

總之,這是一個設計問題。

+0

感謝這個答案雖然我在等待更好的東西......但我也相信有沒有更好的辦法:DI想我會繼續前進,也許使用字符串,因爲在我的應用程序在一個表中的字段包含單個字符/數字並希望字符串將工作。 – IsawU

+0

看來他在使用數組。只要它不包含8000+個元素,一個簡單的複製方法就是'''local new = {unpack(old)}'' – warspyking

+0

@warspyking:「我的表格不是固定長度,而且很大。」所以這似乎不太可能奏效。 –