已将绑定域名给另一个网站,网站后台模板修改用什么软件,中国足球世界排名,微信小程序文档先前我说 Lua 数组从 1 开始不太爽#xff0c;很多人来纠正我说也可以从 0 开始#xff0c;比如#xff1a;
local m { [0] 100, 101, 102, 103 }然后访问时 m[0] 也可以正常访问到第 0 个元素#xff0c;所以 “Lua 给你充分自由度#xff0c;让你可以从任意下标索引数…先前我说 Lua 数组从 1 开始不太爽很多人来纠正我说也可以从 0 开始比如
local m { [0] 100, 101, 102, 103 }然后访问时 m[0] 也可以正常访问到第 0 个元素所以 “Lua 给你充分自由度让你可以从任意下标索引数组”貌似好像说的很有道理但是不是这样呢
我们先用 # 符号打印下上面数组的长度
print(size, #m)输出是3 而不是实际元素个数 4因为 # 就是从 1 开始数起的所以如果你代码里用了 m[0] 你也需要额外方式计算长度同时保证用到这个数组的其他代码也遵从这样计算。
还有一个问题使用 ipairs 遍历的时候m[0] 不会被遍历进去
for i, j in ipairs(m) doprint(i, -, j)
end输出是
1 - 101
2 - 102
3 - 103看到没你的 m[0] 没了即便你写了个 m[0] 100 再 ipairs 那里也不认Lua 没把他算在整数索引范围。那么如果你创建一个数组从 0 开始索引的话你就要通知所有用你数组的人既不能用 # 也不能用 ipairs 来遍历这种沟通成本和后续无穷的麻烦你愿意接受吗
那么你说我们不用 ipairs 改用 pairs 来遍历行不行行你可以这么写
for i, j in pairs(m) doprint(i, -, j)
end但数组从 0 开始的话0 元素没有保存在 array part 里会导致遍历顺序不一样因为优先遍历 array part上面代码的输出是
1 - 101
2 - 102
3 - 103
0 - 100看到没先遍历的 1-3他们在 array part 里最后再遍历 hash part 里 0。你喜欢这样的无序遍历的数组么还是继续坚持 for i 0, N-1 do 来自己遍历并通知你的同事这样才能保持顺序。
最后一个问题是一个 table 中 1-n 的连续整数索引都会被保存到 array part 里而其他会被保存到 hash part 里不管是检索还是遍历都会优先到 array part 里用 O(1) 的方式检索不行再到 hash part 用非 O(1) 的方式同其他 key 一起检索那么你 m[0] 是游离在 array part 外的键不但遍历顺序靠后没和其他元素放一起每次检索还有额外代价。
因此 Lua 支持数组从 0 开始索引么只能说允许你这么用但是语言层面并不提供足够的支持。
那么又会有人混淆视听的说“从 1 开始也挺好的啊我有着并没用什么问题”但他们是不是忘记了 Lua 是嵌入式语言要依靠宿主 C 语言提供运行环境数组从 1 开始的话和 C 语言宿主存在一个换算的关系两边都写得话一会从 0 一会从 1 引入了额外的负担不留神就 BUG 了。
–
扩展阅读还有觉得从 1 开始更合理的点这里
为什么 C 语言数组是从 0 开始计数的