在Lua中循环遍历表中的表

Looping through tables in a table in Lua

本文关键字:遍历 循环 Lua      更新时间:2023-10-16

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

在您的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");

您可以使用遍历表的递归函数:

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是一个布尔值,表示是否为一个数组。