Lua 5.1.4 将数据(不是句柄)从table(数组)传递给函数

Lua 5.1.4 Handing data(not the handle) from table(array) to function

我正在编写 Lua 5.1.4 中的脚本,其函数使用 tables 作为参数。我的问题是,每当我使用 table 作为参数调用函数时,它实际上传递的是 table 的句柄而不是数据。

我做了一个简单的脚本来让我更容易解释这个...

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

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

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

returns

not something

not something

从这个例子中可以清楚地看出 aalpha 是同一个句柄,所以 table alpha 被更改了,但我想以某种方式保留原始句柄alpha 的值(在本例中)。

我有一些想法,但它会使函数变得更大和更慢,所以我想知道是否有一种简单的方法可以做到这一点。值得一提的是,我的 table 不是固定长度的,而且很大。

您必须复制 table。这意味着遍历 table 并复制每个值。

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

如果 table 使用元 table... 那么,您根本无法确定如何复制它。您使用 pairs 迭代的值甚至可能不是真实值。

并且复制函数很困难,因为它们通常具有需要复制的上值才能制​​作函数的 true 副本。复制用户数据 不可能 不知道调用什么 C 函数来复制它(如果甚至有一个 API 这样做的话)。

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

这样做的方法是把作为参数的tables当成immutable。你可以看,但不能触摸。相反,具有函数 return 值;这让调用者自行决定将它们存储在何处。请注意,self 应该被排除在外,因为您可能希望概念性成员函数能够修改它被调用的对象。

总之,这是一个设计问题。