You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

为何Lua递归函数中出现嵌套table?table值替换代码异常求助

问题分析与解决方法

咱们先拆解你的问题:你原本想保留table的嵌套结构,把所有非table类型的值替换成someValue,但运行结果却把所有层级的键都堆到了最外层,完全丢失了原有的嵌套关系。同时你疑惑Lua递归中嵌套table的生成逻辑,咱们一步步理清楚:

问题根源

你的代码里有个关键逻辑错误:递归调用helper时复用了同一个result

看这段核心代码:

result[k] = helper(v, result)

当处理r.request这个嵌套table时,你把最外层的result传给了内层的helper调用。这意味着内层循环里的headersbody会直接被添加到最外层的result中,而不是生成一个新的子表来存储它们,再把这个子表赋值给result.request。最终就导致所有层级的键都被扁平化到了最外层。

至于你问的“为何Lua在递归函数中会生成嵌套table?”——Lua本身不会自动生成嵌套table,完全由你的代码逻辑决定:如果每个层级都创建新表并正确关联,就能得到嵌套结构;如果复用同一个表,就会像你现在这样出现扁平化的问题。

修正后的代码

我们只需要调整helper的逻辑,让它每次处理table时都创建一个新的结果表,不再复用外层的表:

function substitute_in_table(requests) 
    local function helper(r) 
        -- 每次调用helper都新建一个空表,存储当前层级的处理结果
        local result = {}
        for k, v in pairs(r) do 
            if type(v) == "table" then 
                -- 递归处理嵌套table,返回的新表作为当前键的值
                result[k] = helper(v)
            else 
                result[k] = 'someValue' 
            end 
        end 
        return result 
    end 
    return helper(requests) 
end 

r = { request = { headers = "a", body = "b" } } 
result = substitute_in_table(r) 
print(inspect(result))

效果验证

运行修正后的代码,你会得到预期的嵌套结构:

{ request = { headers = "someValue", body = "someValue" } }

这样既保留了原table的层级结构,又把所有非table值替换成了someValue

内容的提问来源于stack exchange,提问作者user9669681

火山引擎 最新活动