通过整数键从C中获取lua表条目

我目前正在使用以下代码从表中获取一个值(cstring = const char*):

template<>
cstring luaTable::get(cstring name) {
    prep_get(name); // 将table[name]放置在堆栈的-1位置
    cstring result;
    if(!lua_isstring(L, -1)) {
        report(name, "is not a string");
        result = "";
    }
    else {
            result = lua_tostring(L, -1);
    }
    lua_pop(L, 1);
    return result;
}
void luaTable::prep_get(cstring name) {
    lua_pushstring(L, name); // name放在-1位置,table放在-2位置
    lua_gettable(L, -2);
    // table[name]现在位于堆栈的-1位置
}

这对于table = {a=10, b=2}形式的表完美地起作用。我如何修改它以从没有键的表中获取值,例如table = {10, 2}

我确定我漏掉了一些简单的东西,但似乎找不到答案。

提前致谢, 本

点赞
用户1483596
用户1483596

抱歉这么快就回答我的问题 - 但是一念之间的启示让我想到:

void luaTable::prep_get(cstring name) {
    lua_pushstring(L, name); // 在 -1 位置上推入名称字符串
    if(lua_isnumber(L, -1)) { // 对于第 i 个元素等,调用 prep_get("i")
        int key = lua_tonumber(L, -1);
        lua_pop(L, 1); // 从 -1 位置上移除名称字符串
        lua_pushnumber(L, key); // 推入名称数到 -1 位置
    }
    lua_gettable(L, -2);
    // 结果现在在栈中的 -1 位置上
}

这样就能按预期工作了。

2013-03-14 19:40:44
用户1177100
用户1177100

@user1483596 我认为那种解决方案行不通。lua_isnumber 函数只会在数值类型的值时返回 true,而你刚刚推入了一个字符串,因此它总是会返回 false。

你可以尝试下面的函数:

void luaTable::prep_get(cstring name) {
   int num = strtol(name, 0, 0);
   if (num > 0) {
      lua_pushnumber(L, num);
   } else {
      lua_pushstring(L, name);
   }
   lua_gettable(L, -2);
}

需要注意的是,它无法处理一个特殊的情况。在 Lua 中,a[1] 和 a["1"] 是不同的。如果你使用这个函数,你将总是将数字视为数组索引,即使它们不是。

如果你想区分这两种情况,你可以重载 prep_get 函数并采用一个数字参数。

2013-03-14 20:32:43