Pico8 Lua中Table作为Array使用时数组长度异常问题咨询
Pico-8 Lua与标准Lua数组长度行为的差异
当把table作为数组使用时,Pico-8 Lua的#运算符(获取数组长度)行为和标准PUC-Rio Lua存在明显不一致,具体场景如下:
测试代码
local t = {} for i = 1, 10 do t[i] = i * 10 end t[2] = nil t[4] = nil t[6] = nil t[8] = nil print() for i = 1, #t do print(t[i]) end
输出对比
标准PUC-Rio Lua 5.4.4(Ubuntu)
输出符合预期,#t返回10,遍历所有索引(包括值为nil的位置):
10 nil 30 nil 50 nil 70 nil 90 100
Pico-8 Lua
#t返回1,仅输出第一个元素:
10
触发条件
该异常仅在设置t[8] = nil时触发:
- 若注释掉
t[8] = nil,Pico-8 Lua的行为与标准Lua一致,#t返回10,遍历所有索引:
10 nil 30 nil 50 nil 70 80 90 100
原因说明
标准Lua中,#运算符的规则是返回数组的边界索引:即最大的整数n,满足t[n]不为nil且t[n+1]为nil(或数组为空时为0),允许数组中间存在nil元素。
而Pico-8 Lua的实现存在特殊逻辑bug:当索引8被设为nil时,错误地将数组长度判定为1,完全忽略后续索引9、10的非nil元素。这是对标准Lua数组长度规则的偏离。
解决办法
在Pico-8中遍历数组时,避免依赖#运算符,改用以下方式:
- 直接遍历已知的索引范围(如本例的1到10)
- 手动维护数组的实际长度变量
示例代码:
local t = {} local arr_len = 10 for i = 1, arr_len do t[i] = i * 10 end t[2] = nil t[4] = nil t[6] = nil t[8] = nil print() for i = 1, arr_len do print(t[i]) end
内容的提问来源于stack exchange,提问作者Oliver Schönrock
相关产品推荐
相关产品推荐

