【问题标题】:Duplicating tables in Lua在 Lua 中复制表
【发布时间】:2016-09-15 01:31:27
【问题描述】:

我在 Lua 如何使用对重复表的引用方面遇到了麻烦。如果我有以下代码:

table = {}
table.hello = "Hello"

function MyFunction (myTable)
        myTable.goodbye = "goodbye"
        return myTable
end

table2 = MyFunction(table)

在此代码中,table2 和 table 最终将具有完全相同的内容。我怎样才能做到只有 table2 有 goodbye 变量?

【问题讨论】:

  • “Lua 使用对重复表的引用”:我认为您理解 Lua 变量引用了一个值,而赋值、返回或参数复制了引用,而不是值。

标签: lua reference


【解决方案1】:

您需要创建一个新表并将旧表中的所有字段复制到其中:

function MyFunction (oldTable)
    local newTable = {}
    for k,v in pairs(oldTable) do
        newTable[k] = v
    end
    newTable.goodbye = "goodbye"
    return newTable
end

我给出的示例仅进行了浅表复制,因此如果 oldTable 具有也是可变表的字段,则它们将仅通过引用进行复制。欲了解更多信息,请参阅http://lua-users.org/wiki/CopyTable

【讨论】:

    【解决方案2】:

    您实际上必须复制表格。

    如果它是一个数组,所以只包含数字作为键,你可以使用经典循环:

    for i=1, #table do
        table2[i] = table[i]
    end
    

    但是,如果您使用文本引用,例如在您的示例中使用 table.goodbye,您需要按键值对进行迭代:

    for k,v in pairs(table) do
        table2[k] = v
    end
    

    在两个循环中,table 表示您要复制的 from 表,table2 是您粘贴的 to 表。

    【讨论】:

    • 注意:pairs 会遍历每个键,而不仅仅是那些字符串类型的键。
    • 另请注意:for i=1, #table do 迭代从 1 到表的“长度”的正整数,仅当 table has a sequence 时才明确定义(也许这是您的意思的超集“是一个数组”;也许不是,因为对我来说,数组只是意味着具有任何值的整数键的有界范围,但序列不能包含 nil 值)。
    • @TomBlodget 我无意暗示;相反,我试图专注于 not 迭代 non 整数键的简单方法。另一方面,第二条评论即使对我来说也是新的,感谢您的启发!
    猜你喜欢
    • 2017-08-28
    • 1970-01-01
    • 2019-04-10
    • 2013-04-06
    • 2021-01-13
    • 2014-03-15
    • 2017-06-29
    • 1970-01-01
    • 2016-12-04
    相关资源
    最近更新 更多