function nop(x)
return x
end
function noop(x)
x={}
return x
end
function nooop(x)
x[#x+1]=4
return x
end
function copyTable(datatable)
local tblRes={}
if type(datatable)=="table" then
for k,v in pairs(datatable) do tblRes[k]=copyTable(v) end
else
tblRes=datatable
end
return tblRes
end
tab={1,2,3}
print(tab) -->table: 0x1d387e0 tab={1,2,3}
print(nop(tab)) -->table: 0x1d387e0 tab={1,2,3}
print(noop(tab)) -->table: 0x1e76f90 tab={1,2,3}
print(nooop(tab)) -->table: 0x1d387e0 tab={1,2,3,4}
print(tab) -->table: 0x1d387e0 tab={1,2,3,4}
print(copyTable(tab)) -->table: 0x1d388d0
我们可以看到,表格的引用通过函数传递时没有改变(当我只是阅读或添加内容),除了在noop()内部尝试对现有内容进行根本修改。
我阅读了Bas Bossink和Michael Anderson在this Q/A中的答案。关于将表格作为参数传递,他们强调了“按引用传递的参数”和“按值传递的参数和表格是引用”的区别,并给出了这种差异出现的例子。
但这具体意味着什么?我们是否拥有引用副本?但与通过引用传递相比,这有什么区别,因为所指向和操作的数据仍然相同,而不是复制?当我们尝试将nil赋给表格时,noop()中的机制是否特定,以避免删除表格,或者在哪些情况下会触发它(我们可以看到,在修改表格时并不总是这种情况)?
我的问题是:传递表格的机制如何工作?是否有一种更有效的方法来复制表格数据而不需要使用copyTable?