1

現在、次のコードを使用してテーブルから値を取得しています(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}ですか?

簡単なものが欠けていると思いますが、答えが見つからないようです。

よろしくお願いします、ベン

編集:いくつかのポップを追加しました

4

2 に答える 2

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
}

これは希望どおりに機能します。

于 2013-03-14T19:40:44.110 に答える
0

@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-14T20:32:43.387 に答える