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

我正在尝试使用纯 Lua 表格实现装配概念。 装配是更大的表格,而原型 / 类是更小的表格,具有匹配键,旨在修改装配中的默认值。 这一直很好,但所有组件都处于实体的同一级别。 现在,我正在尝试按类别组织组件,如下所示:

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

装配只有一个空的物理表(physics = {}

我的组装实体函数是这样的:

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 中获取)

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

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

(只是将 deepcopy 与 assemble_entity 交换)

我发现的问题是大多数组件返回 nil(它明显效率低下,但它不是每帧调用的),因此它绝对是错误的。 我以前从未吸氧过递归,因此感谢任何帮助。

我可以通过存储原型中的每个值来解决这个问题,但是那样就没有使用组装的意义了,我还需要大量的输入。

点赞
用户12135804
用户12135804

仔细看了一下,我意识到我只想要修改一份组装表的内容,所以在 assemble_entity 的第一轮迭代中才需要使用 deepcopy()。在递归调用中创建嵌套组件的副本是不必要的,因此我将函数调用改为:

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

现在它已经可以工作了。

2020-06-13 19:05:35