Lua 5.1.4将表(数组)中的数据(不是句柄)传递给函数

时间:2016-01-10 15:33:20

标签: lua arguments parameter-passing lua-table

我正在使用表作为参数的函数处理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])

返回

  

不是什么

     

不是什么

从这个示例中可以清楚地看出aalpha的句柄相同,因此表alpha会发生变化,但我会以某种方式保留{{1}的原始值(在这个例子中)。

我有一些想法,但它会使功能更大更慢,所以我想知道是否有一个简单的方法来做到这一点。值得一提的是,我的表格长度不固定且非常大。

1 个答案:

答案 0 :(得分:2)

您必须复制该表。这意味着遍历表格并复制每一个值。

当然,如果其中一个值本身就是一个表,那么您需要复制该表。递归。此外,如果其中一个表被引用两次,则应引用您的副本两次,而不是制作新副本。

如果一个表使用了metatable ......那么你根本不能确定如何复制它。您使用pairs迭代的值甚至可能不是实际值。

复制函数很困难,因为它们通常具有需要复制的upvalues来制作函数的 true 副本。复制userdata 不可能,而不知道要调用哪个C函数来复制它(如果有这样做的API)。

如果这种操作是个问题,那么你应该编写函数来避免这个问题,而不是复制表。

执行此操作的方法是将作为参数的表视为不可变参数。你可以看,但不能触摸。相反,具有函数返回值;这使得调用者可以自行决定将它们存储在何处。请注意,self应该从中排除,因为您可能希望概念成员函数能够修改它被调用的对象。

简而言之,这是一个设计问题。