variables - 如何在 Lua 中获取表的实际副本?

标签 variables lua

因此,以下变量都引用同一个表:

x = {1,2,3}
y=x
z=y
table.remove(z,3)

因此下面的代码将输出 1,2
for k,v in pairs(x) do
    print(v)
end

互联网只是指 Lua 总是通过引用而不是值来使用变量的能力。

但有时我想操作一个变量的副本,而不是原始变量。怎么做?为什么 Lua 很难真正按值复制变量,而不仅仅是按引用?

最佳答案

Why does Lua make it so hard to truly copy a variable by value and not just by reference?



因为“复制”表的含义在很大程度上取决于该表中的内容。

首先,一些命名法。您没有引用“变量”;你得到一个表的引用。 “变量”只是一些东西的持有者,比如数字、字符串或对表的引用。

因此,当您说“真正复制变量”时,您的实际意思是“复制表”。而且……这并不容易。

考虑这个表:
local tbl = {x = 5, y = {20}}

如果你想复制那个表,你想拥有新表的y吗?字段是否有旧表存储的表的副本?或者您希望该表本身是原始表的副本?

这两个答案都没有错;你想要哪个完全取决于你想做什么。但是你不能盲目地做表格的递归副本,因为:
local tbl = {x = 5, y = {20}}
tbl._tbl = tbl

该表现在存储对自身的引用。尝试对该表进行盲递归复制将导致无限递归。您必须检测该表是否引用了自身,从而让新表存储对新表的引用。它变得更加复杂:
local tbl = {x = 5, y = {20}}
tbl.z = tbl.y

该表现在有两个字段引用同一个表。如果你想拥有那个表的真实副本,那么副本需要实现两个字段相互引用,这样当它复制第一个字段时,它可以让第二个字段引用新副本,而不是再次复制它。

我什至还没有接触过元表和体操,你可以用它们来完成。这也不包括对根本不可复制的事物的讨论,例如来自基于 C 的 API 的用户数据对象。如果我存储 io.open 的结果在表中,没有复制该文件句柄的机制。那么你的复制程序应该做什么?

Lua 没有默认的表复制 API,以确保您自己花时间弄清楚您的复制算法需要有多复杂。

关于variables - 如何在 Lua 中获取表的实际副本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53990332/

相关文章:

regex - Lua文本解析、空格处理

R将函数作为变量传入

PHP 存储 session : Can't Seem to Serialize Session Variables

python - 在 SQLite (Python) 中将变量字符串传递给 LIKE

variables - 检测变量的变化并做出相应的响应 [Lua]

oop - Lua - 如何动态调用模块?

lua 新手 : C-Lua How to pass a struct/buffer to lua from C?

python - 为什么要替换原始图像矩阵值?

android - 任何优秀的文本编辑器 - Android 应用程序 - 为程序员优化?

sorting - 试图检查我的工作但如何打印()?