因此,以下变量都引用同一个表:
x = {1,2,3}
y=x
z=y
table.remove(z,3)
Run Code Online (Sandbox Code Playgroud)
因此,以下代码将输出1,2
for k,v in pairs(x) do
print(v)
end
Run Code Online (Sandbox Code Playgroud)
互联网只是指Lua总是通过引用而不是价值来使用变量的能力.
但有时我想操纵变量的副本,而不是原始的副本.怎么做?为什么Lua难以真正按值而不仅仅通过引用复制变量?
为什么Lua难以真正按值而不仅仅通过引用复制变量?
因为这意味着什么"复制"一表取决于什么是非常在该表.
首先,一些命名法.你没有引用"变量"; 你得到一个表的参考."变量"只是一个东西的持有者,比如数字,字符串或对表的引用.
所以当你说"真正复制一个变量"时,你实际上的意思是"复制一个表".而且......那并不容易.
考虑一下这个表:
local tbl = {x = 5, y = {20}}
Run Code Online (Sandbox Code Playgroud)
如果要复制该表,是否要让新表的y字段具有旧表存储的表的副本?或者您希望该表本身是原始的副本?
这两个答案都不对; 你想要哪一个完全取决于你想做什么.但你不能盲目地做表的递归副本,因为:
local tbl = {x = 5, y = {20}}
tbl._tbl = tbl
Run Code Online (Sandbox Code Playgroud)
此表现在存储对自身的引用.尝试对该表执行盲目递归复制将导致无限递归.您必须检测表引用自身,从而使新表存储对新表的引用.它变得更加复杂:
local tbl = {x = 5, y = {20}}
tbl.z = tbl.y
Run Code Online (Sandbox Code Playgroud)
此表现在有两个引用同一个表的字段.如果你想拥有该表的真实副本,那么副本需要意识到两个字段相互引用,这样当它复制第一个字段时,它可以让第二个字段引用新副本而不是再次复制它.
我甚至没有进入metatables和体操,你可以与他们接触.这也不包括对基本上不可复制的事物的讨论,例如来自基于C的API的userdata对象.如果我将结果存储io.open在表中,则没有用于复制该文件句柄的机制.那么你的复制程序应该做什么呢?
Lua没有默认的表复制API,以确保您自己花时间弄清楚复制算法需要多么复杂.
| 归档时间: |
|
| 查看次数: |
689 次 |
| 最近记录: |