1. 一些简单的例子
例子中可以看出 ipairs只输出了数组部分,nil截断之后也不会输出
pairs 会输出全部内容
a = {1, 2, nil, 4, b = 1}
for k, v in ipairs(a) do
print("ipairs", k, v);
end
for k, v in pairs(a) do
print("pairs", k, v);
end
// 输出
ipairs 1 1
ipairs 2 2
pairs 1 1
pairs 2 2
pairs 4 4
pairs b 1
ipairs是怎么取值的
可以看出 每次取值是i++ 的取值法
static int ipairsaux(gafq_State *L)
{
int i = gafqL_checkint(L, 2);
gafqL_checktype(L, 1, GAFQ_TTABLE);
i++; // 可以看出 每次取值是i++ 的取值法
gafq_pushinteger(L, i);
gafq_rawgeti(L, 1, i);
return (gafq_isnil(L, -1)) ? 0 : 2;
}
pairs是怎么取值的
可以看出 pairs是通过 栈顶来取值的在gafqH_next中可以看出 会先去array部分 在取hash部分
static int gafqBase_next(gafq_State *L)
{
gafqL_checktype(L, 1, GAFQ_TTABLE);
gafq_settop(L, 2);
if (gafq_next(L, 1))
return 2;
else
{
gafq_pushnil(L);
return 1;
}
}
GAFQ_API int gafq_next(gafq_State *L, int idx)
{
StkId t;
int more;
gafq_lock(L);
t = idx_to_Tvalue(L, idx);
api_check(L, ttistable(t));
more = gafqH_next(L, hvalue(t), L->top - 1);
if (more)
{
api_incr_top(L);
}
else
L->top -= 1;
gafq_unlock(L);
return more;
}
int gafqH_next(gafq_State *L, Table *t, StkId key)
{
int i = findindex(L, t, key);
for (i++; i < t->sizearray; i++)
{
if (!ttisnil(&t->array[i]))
{
setnvalue(key, cast_num(i + 1));
setobj2s(L, key + 1, &t->array[i]);
return 1;
}
}
for (i -= t->sizearray; i < sizenode(t); i++)
{
if (!ttisnil(gval(gnode(t, i))))
{
setobj2s(L, key, key2tval(gnode(t, i)));
setobj2s(L, key + 1, gval(gnode(t, i)));
return 1;
}
}
return 0;
}