You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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. 直接遍历已知的索引范围(如本例的1到10)
  2. 手动维护数组的实际长度变量

示例代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 09:05:14