循环遍历Lua表中的表

时间:2013-05-21 21:45:34

标签: c++ loops lua lua-table

我已经完全走到了尽头。这可能是一个非常基本的东西,它很可能会导致我把头撞到一堵墙上,因为它有一个大脑屁。我的问题基本上是,如果条目本身是表格,你如何在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

2 个答案:

答案 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");

答案 1 :(得分: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是一个布尔值,表示它是否是一个基于一的数组。