Lua中如何批量处理变量大于0递减 避免逐个编写if语句
问题原因
Lua中数字属于值类型,你把a、b、c存入table时,实际上是将变量的值拷贝存入了table,循环中拿到的v只是值的临时拷贝,修改v既不会改动table内的存储值,也不会改动原变量,最后赋值回去的还是table中原本的旧值,所以逻辑不生效。
可行实现方案
方案1:修复原table遍历逻辑,适配临时存值的场景
如果必须保留单独的变量定义,只需要修改遍历逻辑直接修改table元素,最后批量解包赋值回去即可:
a=1;b=2;c=3 local t = {a,b,c} -- 用索引直接修改table内的存储值 for i = 1, #t do if t[i] > 0 then t[i] = t[i] - 1 end end -- 用table.unpack批量赋值,不用逐个写t[1]、t[2] a,b,c = table.unpack(t)
该方案运行开销和逐个写if基本一致,每多一个变量只需要在初始化table和解包时多一个参数,token量远低于逐个写if。
方案2:直接将变量结构化存储在table中(最推荐)
对于同批需要做相同逻辑处理的变量,最优的写法是直接将其作为table的字段存储,不需要单独定义零散变量,也不需要修改原有的变量命名习惯:
-- 初始化时直接把所有变量存入table,新增变量只需要加一行字段定义 local vars = { a = 1, b = 10, c = 12, d = 0, -- 其余变量直接在这里添加即可 } -- 统一遍历处理 for k, v in pairs(vars) do if v > 0 then vars[k] = v - 1 end end -- 后续使用直接访问table的字段即可,无需额外赋值 print(vars.a, vars.b, vars.c)
该方案的运行开销最低,访问table字段的性能和直接访问局部变量几乎没有差异,新增变量不需要修改处理逻辑,token量最少,可维护性最高。
方案3:全局变量批量修改(不推荐)
如果你的变量都是全局变量,也可以通过全局环境表_G批量修改,但全局变量会额外增加访问开销,还可能污染命名空间,仅做参考:
-- 仅适用于全局变量 a=1;b=2;c=3 local var_names = {"a", "b", "c"} for _, name in ipairs(var_names) do if _G[name] > 0 then _G[name] = _G[name] - 1 end end
内容的提问来源于stack exchange,提问作者kite
相关产品推荐
相关产品推荐

