细谈一下lua里很多人有疑问的table长度问题。
<pre name="code" class="cpp">1. > tbl = {1,2,3}
> print(#tbl)
3
>
2. > tbl = {1,nil,3}
> print(#tbl)
3
>
3. > tbl = {1,nil,3,nil}
> print(#tbl)
1
>
情况1正常,情况2有点不正常,情况3很不正常,好,先上源码。
int luaH_getn (Table *t) {
unsigned int j = t->sizearray;
if (j > 0 && ttisnil(&t->array[j - 1])) {
/* there is a boundary in the array part: (binary) search for it */
unsigned int i = 0;
while (j - i > 1) {
unsigned int m = (i+j)/2;
if (ttisnil(&t->array[m - 1])) j = m;
else i = m;
}
return i;
}
/* else must find a boundary in hash part */
else if (isdummy(t->node)) /* hash part is empty? */
return j; /* that is easy... */
else return unbound_search(t, j);
}
<

本文详细探讨了Lua中table长度的特殊情况,通过分析不同条件下的长度计算方式,包括正常情况、数组部分最后为空以及存在hash部分的情况,揭示了Lua table长度可能的不正常表现,并通过实例解释了二分查找在确定长度中的应用。

1万+

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



