Lua中对象内数组长度获取异常导致循环仅执行一次的问题
问题诊断与解决
核心问题
你的char.noteGroup不是直接存储目标元素的数组,而是一个仅包含1个数组元素的外层table。比如实际结构类似:
char.noteGroup = { { 元素1, 元素2, 元素3 } -- 这才是你真正要遍历的数组 }
所以#char.noteGroup统计的是外层table的元素数(也就是1),pairs也只会遍历外层这一个元素,自然循环只执行一次。
修复步骤
- 确认结构:先打印完整的
char.noteGroup内容,验证是否嵌套了一层:-- 手动遍历外层,打印结构信息 for k, v in pairs(char.noteGroup) do debugPrint("外层键:"..k, "值类型:"..type(v), "值长度:"..#v) end - 修正遍历逻辑:如果确实是嵌套一层,直接遍历内层数组即可:
function singStuff(membersIndex, noteData, noteType, char) -- 先拿到真正要遍历的内层数组 local targetNotes = char.noteGroup[1] if not targetNotes or #targetNotes == 0 then return end -- 用ipairs遍历纯数组(比pairs更适配数组结构) for idx, curNote in ipairs(targetNotes) do -- 原注释说明curNote是长度为4的数组,这里替换成你实际需要比较的索引 if noteType == curNote[1] then char.doIdle = false playAnim(char.name, anims[noteData + 1], true) runTimer(("sing_cooldown_" .. char.name), 0.4, 1) elseif noteType == curNote[1]..char.altSuffix then char.doIdle = false playAnim(char.name, anims[noteData + 1]..char.altSuffix, true) runTimer(("sing_cooldown_" .. char.name), 0.4, 1) end end end - 额外注意:
- 原代码中
curNote[e]的e是外层table的键(固定为1),这会导致每次都取curNote的第1个元素,逻辑可能不符合预期,要根据实际需求修改索引; - Lua没有
char.#noteGroup这种语法,获取table字段的长度必须写成#char.noteGroup。
- 原代码中
内容的提问来源于stack exchange,提问作者Marxiplier
相关产品推荐
相关产品推荐

