В настоящее время я использую следующий код для получения значения из таблицы (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}
?
Я уверен, что упускаю что-то простое, но не могу найти ответ.
Заранее спасибо,
Бен
Редактировать: добавлено несколько попсов
Ладно, извините, что так скоро отвечу на мой вопрос — но быстрая вспышка вдохновения привела к:
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
}
который работает как хотелось бы.
@ 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 и взять число.