我有一个需要顺序读取的lua表,但读取顺序完全是随机的
- 表格:**
MP_STATS = {
ENABLE = true,
NOBLOCK = false,
RECOVERY = false,
EXPERIENCE = true,
....
}
- 代码示例:**
void read_test(void){
lua_State *L;
L = luaL_newstate();
luaL_openlibs(L);
if (luaL_loadfile(L, "test.lua") || lua_pcall(L, 0, 0, 0))
{
ShowError("Error reading 'test.lua'\n");
return;
}
lua_getglobal(L, "MP_STATS");
lua_pushnil(L);
while (lua_next(L, 1) != 0) {
const char *name = lua_tostring(L, 2);
if(check_exist_stats(name) == 0) {
printf("Stats %s not exist.\n", name);
lua_pop(L, 1);
continue;
}
lua_getfield(L, lua_gettop(L), name);
myvar = lua_toboolean(L, lua_gettop(L));
lua_pop(L, 1);
printf("%s\n", name);
}
lua_close(L);
printf("Read test.lua complete.\n");
}
当我运行这个程序时,我有如下的读取顺序
- 首次运行:**
MP_NOBLOCK
MP_ENABLE
MP_EXPERIENCE
MP_RECOVERY
- 第二次运行:**
MP_RECOVERY
MP_ENABLE
MP_NOBLOCK
MP_EXPERIENCE
- 第三次运行:**
MP_ENABLE
MP_NOBLOCK
MP_EXPERIENCE
MP_RECOVERY
我应该怎样做才能使阅读按顺序进行?
2条答案
按热度按时间gwbalxhn1#
Lua表的非序列条目使用散列部分--也就是说,遍历的顺序取决于键的散列;它不依赖于表构造函数(代码)中键-值对的顺序。2较新的Lua版本将“随机化”散列值以减轻散列冲突攻击。3这就是为什么每次都得到不同的顺序。
“修复”是:
1.保留当前的表结构,但添加第二个表
local order = {"ENABLE", "NOBLOCK", "EXPERIENCE", "RECOVERY", ...}
以记住键的顺序,然后使用ipairs
循环第二个表,该表使用“数组部分”in order,并使用值作为当前表结构的键。1.切换到
MP_STATS
表的“列表”,并使用所述order
表查找给定索引的键。1.切换到“对”
{key = "...", value = "..."}
的“列表”,可以使用ipairs
按顺序迭代。jslywgbw2#
表是关联数组。根据实现的不同,它们可能提供一致的排序,也可能不提供一致的排序。
那么Lua是否使用了返回一致排序的实现呢?正如您已经发现的那样,没有。
next
的文档中说:“索引的枚举顺序没有指定,即使是数字索引也是如此。”Lua并没有按照您希望的(未指定的)顺序提供元素,因为它以任意顺序返回元素。
注意,顺序不是随机的,只是任意的。