0

我已经为此陷入了完全的死胡同。这可能是非常基本的事情,而且很可能会导致我因为脑放屁而将头撞到墙上。我的问题基本上是,如果条目本身就是表,你如何循环遍历 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
4

2 回答 2

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");
于 2013-05-21T22:09:08.817 回答
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是一个布尔值,指示它是否是基于 1 的数组。

于 2013-05-22T07:34:53.110 回答