在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? 结束

点赞
用户234175
用户234175

在您的 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");
2013-05-21 22:09:08
用户2198692
用户2198692

你可以使用递归函数来遍历表格:

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)    --假设类型与父表相同
        else
            --做其他的事情
        end
    end
end

这只是一个基本的例子,但可以给你一个大致的想法。 array 是一个布尔值,表示是否为基于一的数组。

2013-05-22 07:34:53