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