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

时间:2013-03-14 19:26:49

标签: c++ lua lua-table

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

template<>
cstring luaTable::get(cstring name) {
    prep_get(name); // puts table[name] at -1 in stack
    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 at -1, table at -2
    lua_gettable(L, -2);
    // table[name] is now at position -1 in stack
}

这适用于表格table = {a=10, b=2}的表格。如何修改它以从没有诸如table = {10, 2}

等键的表中获取值

我确定我错过了一些简单但似乎无法找到答案的内容。

提前致谢, 本

编辑:添加了一些流行音乐

2 个答案:

答案 0 :(得分:1)

很抱歉很快回答了我自己的问题 - 但是一瞬间的灵感导致:

void luaTable::prep_get(cstring name) {
    lua_pushstring(L, name); // name string at -1
    if(lua_isnumber(L, -1)) { // call prep_get("i") for ith element etc
        int key = lua_tonumber(L, -1);
        lua_pop(L, 1); // remove the name string from -1
        lua_pushnumber(L, key); // push name number to -1
    }
    lua_gettable(L, -2);
    // result is now at position -1 in stack
}

根据需要运作。

答案 1 :(得分:0)

@ user1483596我不认为该解决方案可行。如果值的类型为number,则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中,[1]和[“1”]是不同的。如果使用此函数,您将始终将数字视为数组索引,即使它们不是。

如果你想区分这两种情况,那么你可以重载prep_get并取一个数字。