最近我写了一些Lua代码:
local a = {} for i = 1,n do local copy = a -- alter the values in the copy end
显然,这不是我想做的,因为变量持有一个匿名表的引用,而不是Lua中的表本身的值。这显然是在Programming in Lua年,但我忘了它。
所以问题是我应该写什么,而不是copy = a得到一个值的副本?
解决方法
要打一点可读的代码高尔夫,这里是一个简单的版本,处理标准的棘手案件:
>表作为键,
>保存元表,和
>递归表。
我们可以在7行:
function copy(obj,seen) if type(obj) ~= 'table' then return obj end if seen and seen[obj] then return seen[obj] end local s = seen or {} local res = setMetatable({},getMetatable(obj)) s[obj] = res for k,v in pairs(obj) do res[copy(k,s)] = copy(v,s) end return res end
在this gist年有一个简短的Lua深度复制操作。
另一个有用的参考是this Lua-users wiki page,其中包括一个如何避免__pairs元方法的示例。