将表格元素复制到新表格

我有一个表格,用于保存用户收集的信息,并以以下格式填充:

TempTable = {}
TempTable["date"] = {day, month, year}
TempTable["name"] = "Name Here"
TempTable["address"] = "Address Here"
etc

然后我有一个主表格,将保存所有收集的信息

MainTable = {}
MainTable[1] = { date = {day, month, year}, name = "Name Here", address = "Address Here" }
MainTable[2] = { date = {day, month, year}, name = "Name Here", address = "Address Here" }

我还很新Lua,所以在将TempTable复制到MainTable时遇到了一些麻烦。

如果这是一个重复的问题,对不起,我在创建此问题之前检查了许多类似的线程。

编辑:我已尝试MainTable[i] = TempTable和table.insert(MainTable,TempTable)。问题是在这样做之后,如果TempTable中的任何值发生变化,它也将在MainTable中发生变化。

点赞
用户2858170
用户2858170

使用table.insert(MainTable, TempTable)可以将TempTable插入到MainTable中。

请参考: http://www.lua.org/manual/5.3/manual.html#pdf-table.insert

当然,您也可以像这样将其分配给MainTable的元素:

MainTable[1] = TempTable

或在循环中使用MainTable[i] = TempTable...

随你喜欢。

确保为MainTable中的每个实例创建一个新表。表是通过引用传递的。如果您重用或更改TempTable,您也会更改MainTable的内容。

只需在一个小函数中创建您的TempTables(简化示例)

function CreateNewEntry(name)
 local newEntry = {}
 newEntry.name = name or "no name"
   return newEntry
end

然后像这样使用它:

MainTable = {}
table.insert(MainTable, CreateNewEntry("NuMs"))
table.insert(MainTable, CreateNewEntry("Piglet"))
2016-06-01 10:44:52
用户3197530
用户3197530

如 Piglet 所指出的那样,你可以像他的示例中那样使用临时表。函数内部对表的引用将在函数之后丢失,所以访问 newEntry 的唯一方法是通过主表。

但是,如果你真的需要复制(确实复制)表格,你需要使用一个函数来实现。但要记住,你经常不需要复制。

这个答案中,展示了一个非常简短的 table 深拷贝方法。这可以用于使两个表格相互独立。这也处理了一些其他的东西,比如元表。此外,答案还提供了一些更深入的阅读链接。

我建议你使用 lua 的 penlight 库,这是一个非官方的 “标准” 库,非常有用。它有丰富的 文档,包括 指南 来展示你可以用 Penlight 做什么。在你的情况下,它提供了一个深度复制函数,所以一切都归结于这个:

local tablex = require "pl.tablex"

local tempTable = {}
-- 其他代码
local mainTable = {}
-- 其他代码

table.insert(mainTable, tablex.deepcopy(tempTable))

最后,一个关于 lua 语法的小建议:lua 的一个部分起源于数据描述语言,因此很容易和优美地编写这些内容:

TempTable = {
    date = { day, month, year },
    name = "Name Here",
    address = "Address Here", -- 你可以在最后一个元素后放一个逗号
}

现在使用函数编写方式,你可以将所有内容很好地打包起来:

function create_entry(name, address, date)
    local date = date or get_current_date() -- 如果缺少日期参数,则使用当前日期
    return {
        name = name,
        address = address,
        date = date
    }
end

-- 可以这样使用:
table.insert(mainTable, create_entry("Foibudle", "12345 Dreamland", date("12-03-2015"))
-- 也可以不使用日期:
table.insert(mainTable, create_entry("Foibudle", "12345 Dreamland")
2016-06-01 15:52:38