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

我正在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])

返回结果:

not something

not something

从这个示例中可以清楚地看到,a是与alpha相同的句柄,所以表alpha被更改了,但我想在一定程度上保留alpha的原始值(在此示例中)。

我有一些想法,但这会使函数变得更大和更慢,因此我想知道是否有一种简单的方法来做到这一点。重要的是要提到,我的表不是固定长度而且相当大。

点赞
用户734069
用户734069

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

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

如果表格使用元表...嗯,你根本无法确定如何复制它。你用pairs迭代的值可能甚至不是真正的值。

复制函数很困难,因为它们经常具有需要复制以进行功能__True_复制的上值。如果没有知道要调用哪个C函数来复制它(即使有API可以这样做),则无法复制userdata。

如果这种操作是问题,那么您应该编写函数以避免此问题,而不是复制表格。

这样做的方法是将作为参数传递的表格视为不可变的。你可以看,但不能动。相反,让函数返回值;这使得调用者可以决定在何处存储它们。请注意,应该将self排除在外,因为您可能希望概念成员函数能够修改调用它的对象。

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

2016-01-10 16:01:17