2013-05-21 28 views
0

我已經完成了一個完整的死角。這可能會是一件非常基本的事情,它很可能會導致我頭腦發熱,因爲有一個重大的放屁。我的問題基本上是,如果條目本身是表格,你如何循環lua中的表格?在Lua中的表格中循環表格

C++:

lua_newtable(luaState); 
    for(auto rec : recpay) { 
     lua_newtable(luaState); 

     lua_pushnumber(luaState, rec.amount); 
     lua_setfield(luaState, -2, "Amount"); 

     lua_pushnumber(luaState, rec.units); 
     lua_setfield(luaState, -2, "Units"); 

     lua_setfield(luaState, -2, rec.type); 
    } 
lua_setglobal(luaState, "RecuringPayments"); 

的Lua:

for _,RecWT in ipairs(RecuringPayments) do 
    -- RecWT.Amount = nil? 
end 
+0

我想你可能只是想遞歸遍歷。 –

回答

1

在你的C++代碼,它看起來像你的字符串作爲一個鍵,而不是通過索引設置子表。要遍歷您有一個入口來使用,而不是pairs

for recType, RecWT in pairs(RecuringPayments) do 
    assert(RecWT.Amount ~= nil) 
end 

注意ipairs只遍歷表的索引部分,聯想的部分被忽略。

另外,如果你想使用索引訪問,那麼你必須與lua_settable設置鍵值改爲:

lua_newtable(luaState); 
int i = 0; 
for(auto rec : recpay) 
{ 
    lua_newtable(luaState); 

    lua_pushnumber(luaState, rec.amount); 
    lua_setfield(luaState, -2, "Amount"); 

    lua_pushnumber(luaState, rec.units); 
    lua_setfield(luaState, -2, "Units"); 

    lua_pushnumber(luaState, ++i); 
    lua_insert(luaState, -2); 
    lua_settable(luaState, -3); 
} 
lua_setglobal(luaState, "RecuringPayments"); 
+0

看到我知道這將是愚蠢的,謝謝你。 – user2407229

0

您可以使用遍歷表的遞歸函數:

function traversetable(tab, array) 
    local iteratefunc = array and ipairs or pairs 
    for k, v in iteratefunc(tab) do 
     if type(v) == "table" then 
      traversetable(v, array) --Assumes that type is the same as the parent's table 
     else 
      --Do other stuff 
     end 
    end 
end 

這只是一個基本的例子,但給你一個粗略的想法。 array是一個布爾值,表示它是否是一個基於數組的數組。