最近我写了一些类似以下的 Lua 代码:
local a = {}
for i = 1, n do
local copy = a
-- alter the values in the copy
end
显然,这不是我想要的,因为在Lua中变量保存的是匿名表的引用而不是表本身的值。这在《Lua编程》明确说明了,但我忘记了这一点。所以问题是,我应该写什么代码来获取a
表中的值的副本,而不是像copy = a
那样获取表的引用?在这里使用Penlight库: https://stevedonovan.github.io/Penlight/api/libraries/pl.tablex.html#deepcopy
local pl = require 'pl.import_into'()
local newTable = pl.tablex.deepcopy(oldTable)
只需使用
local unpack = unpack or table.unpack
list2 = {unpack (list)}
这就是你在基本表中能得到的最好的结果了。如果你需要复制带有元表的表,请使用类似deepcopy的东西。
a = {}; a [a] = a
的表格,则很容易看出。Jon提到的deepcopy函数可以解决这个问题,因此如果需要创建真正/完整的副本,则应使用deepcopy
。deepcopy
应该深入多少层?deepcopy({m = _G.mymodule})
应该递归复制整个 mymodule
表还是仅复制对 mymodule
的引用,一旦它意识到可以从全局环境访问 mymodule
? - Egor Skriptunofflocal data = {DIN1 = "Input(z)", DIN2 = "Input(y)", AINA1 = "Input(x)"}
function table.copy(mytable) --mytable = the table you need to copy
newtable = {}
for k,v in pairs(mytable) do
newtable[k] = v
end
return newtable
end
new_table = table.copy(data) --copys the table "data"
local copyOfTable = json.decode( json.encode( sourceTable ) )
我正在为Fibaro Home Center 2编写Lua代码,用于家庭自动化。由于Lua的实现非常有限,没有可以参考的中央函数库。因此,每个函数都需要在代码中声明,以保持代码可维护性,因此像这样的一行解决方案是可取的。