如何在c代码中执行lua表的顺序读取

ylamdve6  于 2023-01-25  发布在  其他
关注(0)|答案(2)|浏览(136)

我有一个需要顺序读取的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

我应该怎样做才能使阅读按顺序进行?

gwbalxhn

gwbalxhn1#

Lua表的非序列条目使用散列部分--也就是说,遍历的顺序取决于键的散列;它不依赖于表构造函数(代码)中键-值对的顺序。2较新的Lua版本将“随机化”散列值以减轻散列冲突攻击。3这就是为什么每次都得到不同的顺序。
“修复”是:
1.保留当前的表结构,但添加第二个表local order = {"ENABLE", "NOBLOCK", "EXPERIENCE", "RECOVERY", ...}以记住键的顺序,然后使用ipairs循环第二个表,该表使用“数组部分”in order,并使用值作为当前表结构的键。
1.切换到MP_STATS表的“列表”,并使用所述order表查找给定索引的键。
1.切换到“对”{key = "...", value = "..."}的“列表”,可以使用ipairs按顺序迭代。

jslywgbw

jslywgbw2#

表是关联数组。根据实现的不同,它们可能提供一致的排序,也可能不提供一致的排序。
那么Lua是否使用了返回一致排序的实现呢?正如您已经发现的那样,没有。next的文档中说:“索引的枚举顺序没有指定,即使是数字索引也是如此。”
Lua并没有按照您希望的(未指定的)顺序提供元素,因为它以任意顺序返回元素。
注意,顺序不是随机的,只是任意的。

相关问题