我嘗試高效地製作lua表格的副本。我寫了下面的函數copyTable(),它很好地工作(見下文)。但我想我可以使用功能的「傳值」機制來提高效率。我做了一些測試,以探索這個機制:Lua:有效地複製表格(深層複製)
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
我們可以看出,表中的參數通過職能轉移不變(當我剛讀或添加的東西),除了空操作中(),我嘗試對現有的一個徹底的修改。
我看了Bas Bossink和Michael Anderson在this Q/A的回答。關於傳遞或表作爲參數,他們強調了「由ref傳遞的參數」和「由值和表傳遞的參數是引用」之間的區別,以及出現這種區別的示例。
但是,這是什麼意思呢?我們是否有參考文獻的副本,但是由於數據指向並因此被操縱的數據仍然是相同的,不會被複制,所以與通過ref有什麼不同?當我們試圖影響表的nil時,noop()中的機制是特定的,這是爲了避免刪除表或在哪些情況下會觸發(我們可以用nooop()看到,並不總是如此表被修改)?
我的問題:如何通過表真正起作用的機制?有沒有辦法讓一個更有效的方式來複製表的數據沒有我的copyTable的負擔?
遞歸和尾調用。這就和你一樣高效。 – warspyking
@warspyking:我會在太空中獲得更多速度嗎?當我需要組裝子表時,我應該如何「符合」尾部呼叫? – user1771398
https://www.lua.org/pil/6.3.html – warspyking