Lua递归函数避免丢失表引用,实现原表数据修改
Lua递归修改嵌套表指定键值的正确写法
你需要递归修改嵌套Lua表的指定键值,并且让修改同步到原表,但当前的递归函数有两个关键问题导致修改不生效:
原代码问题分析
- 递归时用了
return func(v),这会导致遍历到第一个子表(比如tablePlayer)就直接返回,不会继续处理当前表的其他元素,也没法正确完成全表的递归遍历 - 修改值时直接给局部变量
v赋值,这只是改变了局部变量的指向,并没有修改原表中对应键的实际值
你的原示例表:
local table = { tablePlayer = { ["Volcam"] = "Druid", ["Chaman King"] = "Paladin" } }
原递归函数:
local function func(t) for k, v in pairs(t) do if type(v) == "table" then return func(v) else if k == "Volcam" then v = "Master" -- 这里只是修改局部变量,原表不受影响 end end end end func(table) -- 调用函数
执行后print(table.tablePlayer.Volcam)仍然输出Druid,达不到预期的Master。
修正后的递归函数
local function update_table(t, target_key, new_value) for k, v in pairs(t) do if type(v) == "table" then update_table(v, target_key, new_value) -- 去掉return,继续递归遍历所有子表 else if k == target_key then t[k] = new_value -- 直接通过原表的键赋值,修改原表引用 end end end end -- 调用函数,指定要修改的键和新值 update_table(table, "Volcam", "Master")
验证结果
执行以下代码:
print(table.tablePlayer.Volcam) -- 输出: Master
这样修改后,递归会完整遍历所有嵌套子表,并且通过直接操作原表的键来修改值,确保原表的引用同步更新。
内容的提问来源于stack exchange,提问作者Enrique L
相关产品推荐
相关产品推荐

