如何从Lua表中获取非nil数据?二维表取值报错排查
解决Lua二维表索引nil值的报错问题
我一眼就揪出问题所在了——你的判断逻辑漏掉了最关键的前置检查!
错误原因拆解
你当前的代码直接写了if (bigTable[a + d][b + d]) then,但如果bigTable[a + d]本身就是nil(比如a+d超出了bigTable的行数范围时),Lua会立刻抛出你看到的“attempt to index field '?' (a nil value)”错误——因为你不能对一个nil值进行索引操作。你的判断只检查了内层元素,却没先确认外层的行是否存在。
修改后的getRow函数
function getRow(a, b) local row = {} -- 建议用局部变量,避免污染全局环境 for d = 0, 3 do local currentRow = bigTable[a + d] -- 先判断当前行是否存在,再检查对应位置的元素 if currentRow and currentRow[b + d] then table.insert(row, currentRow[b + d]) end end return row end
核心优化点
- 先把
bigTable[a + d]赋值给currentRow,优先判断该行是否存在,再去访问子元素,从根源避免索引nil的错误 - 将
row改为局部变量local row,这是Lua开发的最佳实践,防止意外修改全局变量 - 利用
and的短路逻辑:只有当currentRow有效时,才会继续检查currentRow[b + d],既安全又高效
修改后,不管是目标行不存在还是行内元素为nil,代码都会自动跳过这些无效项,只把存在的元素插入到结果列表里,不会再触发报错。
内容的提问来源于stack exchange,提问作者creyD
相关产品推荐
相关产品推荐

