在Lua中循环遍历表中的表
Looping through tables in a table in 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?
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
是一个布尔值,表示是否为一个数组。
相关文章:
- 在循环中按顺序遍历成员变量
- 遍历链表时的无限循环
- C++声明双链表,使用两个 for 循环双向遍历列表并打印
- 为什么即使使用 for 循环遍历我的向量,它也没有输出到控制台?(C++)
- 循环遍历标准的正确方法::array<char*, N>
- 我该如何循环遍历我的数组(缓冲区——包含一个文本文件),并将其打印成30字节的块
- cpp 为什么 boost::线程内部的循环不遍历所有值并且推送相同的值?
- 如何在重复循环中循环遍历 std::vector
- 程序在遍历所有值之前离开循环. 数组的
- 遍历 STL 映射(集/多集)的最佳方法,同时元素可能会在循环期间被删除并重新插入?
- 数组 - 循环遍历辅助阵列
- 使用相同的 for 循环按升序或降序遍历地图
- 在C++中循环遍历二维数组时改进 O(n)
- 如何在 uwp c# 中循环遍历和检查 Xbox 控制器状态
- 循环遍历向量<string>并保持每个元素"count"时出现问题
- 如何使用 c++11 语法创建 for 循环以遍历向量
- IOS objective-C 循环遍历 2 个数组
- 如何修复关卡顺序遍历问题(二叉树)的无限循环错误
- 循环遍历地图时编译错误
- std:vector的替代项,用于在遍历循环时删除其元素