如何复制匹配键上的嵌套 Table 值

How To Copy Nested Table Values on Matching Keys

我正在尝试使用纯 Lua table 来实现组合的概念。程序集较大 tables 而 archetypes/classes 较小 tables 具有匹配键意味着修改集合中的默认值。这一直运行良好,但所有组件都位于实体内的同一级别。现在我正在尝试按类别组织组件,如下所示:

archetype = {
   physics = {
        accel = 100, vel = {50, 50}, jump = 80
        },

组合刚好在物理下空table(physics = {})

我对 assemble 一个实体 的函数是 这个:

function assemble_entity(assemblage, arch, x, y)
    new_ent = deepcopy(assemblage)
    for pkey, pvalue in pairs(new_ent) do
        for ckey, cvalue in pairs(arch) do
            if pkey == ckey then
                if type(cvalue) == 'table' then
                    new_ent[pkey] = deepcopy(cvalue)
                else
                    new_ent[pkey] = cvalue
                end
            end
        end
    end
end

(deepcopy 刚刚取自 lua 用户 wiki)

但是,由于原型 table 仅包含修改后的值,将原型的组件复制到组合中将覆盖组合的默认值。我尝试了递归:

function assemble_entity(assemblage, arch)
    new_ent = deepcopy(assemblage)
    for pkey, pvalue in pairs(new_ent) do
        for ckey, cvalue in pairs(arch) do
            if pkey == ckey then
                if type(cvalue) == 'table' then
                    new_ent[pkey] = assemble_entity(pvalue, cvalue)
                else
                    new_ent[pkey] = cvalue
                end
            end
        end
    end
    return new_ent
end

(刚刚用 assemble_entity 交换了 deepcopy)

我发现的问题是大多数组件 return nil(而且效率明显很低,但并不是每一帧都调用它),所以它肯定是错误的。我以前从来没有弄乱过递归,所以感谢任何帮助。

我可以通过将每个值存储在原型中来解决这个问题,但是这样使用组合就没有意义了,而且我会提前输入 很多of我.

重新审视之后,我意识到我只想修改集合 table 内容的单个副本,因此只有在 [=11] 的第一次迭代时才需要 deepcopy() =].在递归调用中创建其嵌套组件的副本是不必要的,因此我将函数调用更改为:

new_ent = deepcopy(assemblage)
new_ent = assemble_entity(new_ent, archetype)

现在可以使用了