1. 程式人生 > >lua_next函式分析

lua_next函式分析

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 就又位於棧頂了。