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
从这个例子中可以清楚地看出 a
与 alpha
是同一个句柄,所以 table alpha
被更改了,但我想以某种方式保留原始句柄alpha
的值(在本例中)。
我有一些想法,但它会使函数变得更大和更慢,所以我想知道是否有一种简单的方法可以做到这一点。值得一提的是,我的 table 不是固定长度的,而且很大。
您必须复制 table。这意味着遍历 table 并复制每个值。
当然,如果其中一个值本身是 table,那么您需要复制那个 table。递归地。此外,如果其中一个 table 被引用两次,您应该引用您的副本两次,而不是创建一个新副本。
如果 table 使用元 table... 那么,您根本无法确定如何复制它。您使用 pairs
迭代的值甚至可能不是真实值。
并且复制函数很困难,因为它们通常具有需要复制的上值才能制作函数的 true 副本。复制用户数据 不可能 不知道调用什么 C 函数来复制它(如果甚至有一个 API 这样做的话)。
如果这种操作有问题,那么您应该编写函数来避免此问题,而不是复制 tables。
这样做的方法是把作为参数的tables当成immutable。你可以看,但不能触摸。相反,具有函数 return 值;这让调用者自行决定将它们存储在何处。请注意,self
应该被排除在外,因为您可能希望概念性成员函数能够修改它被调用的对象。
总之,这是一个设计问题。
我正在编写 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
从这个例子中可以清楚地看出 a
与 alpha
是同一个句柄,所以 table alpha
被更改了,但我想以某种方式保留原始句柄alpha
的值(在本例中)。
我有一些想法,但它会使函数变得更大和更慢,所以我想知道是否有一种简单的方法可以做到这一点。值得一提的是,我的 table 不是固定长度的,而且很大。
您必须复制 table。这意味着遍历 table 并复制每个值。
当然,如果其中一个值本身是 table,那么您需要复制那个 table。递归地。此外,如果其中一个 table 被引用两次,您应该引用您的副本两次,而不是创建一个新副本。
如果 table 使用元 table... 那么,您根本无法确定如何复制它。您使用 pairs
迭代的值甚至可能不是真实值。
并且复制函数很困难,因为它们通常具有需要复制的上值才能制作函数的 true 副本。复制用户数据 不可能 不知道调用什么 C 函数来复制它(如果甚至有一个 API 这样做的话)。
如果这种操作有问题,那么您应该编写函数来避免此问题,而不是复制 tables。
这样做的方法是把作为参数的tables当成immutable。你可以看,但不能触摸。相反,具有函数 return 值;这让调用者自行决定将它们存储在何处。请注意,self
应该被排除在外,因为您可能希望概念性成员函数能够修改它被调用的对象。
总之,这是一个设计问题。