您的位置:首页 > 编程语言 > Lua

lua_next函数分析

2015-08-16 15:54 561 查看
lua_next(L,index):先把 表(lua栈 index所指的表), 的当前索引弹出,再把table 当前索引的值弹出,也就是先弹出 table的索引,再弹出table索引的值

简单一个例子:

<span style="font-family:KaiTi_GB2312;font-size:14px;">NUMBER_TABLE_WITH_INDEX =
{
["a"] = 1,
["b"] = 2,
["c"] = 3
}</span>
<span style="font-family:KaiTi_GB2312;font-size:14px;"> lua_getglobal(L,"STRING_TABLE_WITH_INDEX");
/*此时lua栈状态
----------------------------------
|  -1 table NUMBER_TABLE
----------------------------------
*/</span>


//循环遍历
lua_pushnil(L);
/*此时lua栈状态
----------------------------------
|  -1 nil
|  -2 table NUMBER_TABLE
----------------------------------
*/
while(lua_next(L,-2))
{
/*此时lua栈状态
----------------------------------
|  -1 value
|  -2 key
|  -3 table NUMBER_TABLE
----------------------------------
*/
if(lua_isnumber(L,-2))
cout<<"key:"<<lua_tonumber(L,-2)<<'\t';
else if(lua_isstring(L,-2))
cout<<"key:"<<lua_tostring(L,-2)<<'\t';
if(lua_isnumber(L,-1))
cout<<"value:"<<lua_tonumber(L,-1)<<endl;
else if(lua_isstring(L,-1))
cout<<"value:"<<lua_tostring(L,-1)<<endl;

/*此时lua栈状态
----------------------------------
|  -1 value
|  -2 key
|  -3 table NUMBER_TABLE
----------------------------------
*/
lua_pop(L,1);
/*此时lua栈状态
----------------------------------
|  -1 key
|  -2 table NUMBER_TABLE
----------------------------------
*/
}
lua_pop(L,1);

/*此时lua栈状态
----------------------------------
|  -1 table NUMBER_TABLE
----------------------------------
*/


lua_next函数的工作流程现在大概了解了。还是婆婆妈妈的上一段文字吧:

lua_next() 这个函数的工作过程是:

1) 先从栈顶弹出一个 key

2) 从栈指定位置的 table 里取下一对 key-value,先将 key 入栈再将 value 入栈

3) 如果第 2 步成功则返回非 0 值,否则返回 0,并且不向栈中压入任何值

第 2 步中从 table 里取出所谓“下一对 key-value”是相对于第 1 步中弹出的 key 的。table 里第一对 key-value 的前面没有数据,所以先用 lua_pushnil() 压入一个 nil 充当初始 key。

注意开始的时候先用 lua_gettop() 取了一下 table 在栈中的正索引(前面说过了,在进行这个 lua_next() 过程之前先将 table 入栈,所以栈大小就是 table 的正索引),后面的 lua_next() 过程中不断的有元素出入栈,所以使用正索引来定位 table 比较方便。

到了 table 中已经没有 key-value 对时,lua_next() 先弹出最后一个 key,然后发现已经没有数据了会返回 0,while 循环结束。所以这个 lua_next() 过程结束以后 table 就又位于栈顶了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  lua lua_next