Получить запись таблицы lua из C с помощью целочисленного ключа

В настоящее время я использую следующий код для получения значения из таблицы (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}?

Я уверен, что упускаю что-то простое, но не могу найти ответ.

Заранее спасибо,
Бен

Редактировать: добавлено несколько попсов

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

Другие решения

@ 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 и взять число.

0

По вопросам рекламы [email protected]