我正在使用表作为参数的函数处理Lua 5.1.4中的脚本。我的问题是每当我用table作为参数调用函数时,它实际上传递了表的句柄而不是数据。
我制作了一个简单的脚本,让我更容易解释这个......
function test(a)
a[2]="not something"
return a
end
alpha={"hello","something"}
bravo=test(alpha)
print(alpha[2])
print(bravo[2])
返回
不是什么
不是什么
从这个示例中可以清楚地看出a
与alpha
的句柄相同,因此表alpha
会发生变化,但我会以某种方式保留{{1}的原始值(在这个例子中)。
我有一些想法,但它会使功能更大更慢,所以我想知道是否有一个简单的方法来做到这一点。值得一提的是,我的表格长度不固定且非常大。
答案 0 :(得分:2)
您必须复制该表。这意味着遍历表格并复制每一个值。
当然,如果其中一个值本身就是一个表,那么您需要复制该表。递归。此外,如果其中一个表被引用两次,则应引用您的副本两次,而不是制作新副本。
如果一个表使用了metatable ......那么你根本不能确定如何复制它。您使用pairs
迭代的值甚至可能不是实际值。
复制函数很困难,因为它们通常具有需要复制的upvalues来制作函数的 true 副本。复制userdata 不可能,而不知道要调用哪个C函数来复制它(如果有这样做的API)。
如果这种操作是个问题,那么你应该编写函数来避免这个问题,而不是复制表。
执行此操作的方法是将作为参数的表视为不可变参数。你可以看,但不能触摸。相反,具有函数返回值;这使得调用者可以自行决定将它们存储在何处。请注意,self
应该从中排除,因为您可能希望概念成员函数能够修改它被调用的对象。
简而言之,这是一个设计问题。