“#”lua表长度计算
local a = {};
a[1] = 10;
a[2] = 20;
a[3] = 30;
a[4] = 40;
--a[6] = 60;
a[7] = 70;
print(#a); -->4
local a = {};
a[1] = 10;
a[2] = 20;
a[3] = 30;
a[4] = 40;
a[6] = 60;
a[7] = 70;
print(#a); -->7
这里就比较奇怪了,得到的不是table的长度。Lua文档中说,如果是一个连续的序列,那么才可以用#计算table的长度,如果中间有nil值,计算将会有问题。那就到源码中找找答案。#计算长度调用的是lua_rawlen函数,该函数如下。
LUA_API size_t lua_rawlen (lua_State *L, int idx) {
StkId o = index2addr(L, idx);
switch (ttypenv(o)) {

本文详细介绍了Lua5.2.3中表的长度计算,通过源码分析luaH_getn函数揭示了#运算符在面对含有nil值的连续序列时可能产生的问题。此外,还探讨了table的遍历机制,luaH_next函数如何处理数组和哈希部分的元素。同时,文章提到了rehash过程及其在luaH_newkey中的触发条件。最后,对比了ipairs与pairs在遍历table时的区别,强调了在遍历过程中插入元素可能导致的不确定性。
最低0.47元/天 解锁文章
6805

被折叠的 条评论
为什么被折叠?



