c/c++從棧上獲取Lua壓棧過來的table數據
map<string,string> traverse_table(lua_State *L, int index)
{
map<string,string> data;
lua_pushnil(L);
// 現在的棧:-1 => nil; index => table
index = index - 1;
while (lua_next(L, index))
{
// 現在的棧:-1 => value; -2 => key; index => table
// 拷貝一份 key 到棧頂,然后對它做 lua_tostring 就不會改變原始的 key 值了
lua_pushvalue(L, -2);
// 現在的棧:-1 => key; -2 => value; -3 => key; index => table
const char* key = lua_tostring(L, -1);
const char* value = lua_tostring(L, -2);
data[key]=value;
// 彈出 value 和拷貝的 key,留下原始的 key 作為下一次 lua_next 的參數
lua_pop(L, 2);
// 現在的棧:-1 => key; index => table
}
// 現在的棧:index => table (最后 lua_next 返回 0 的時候它已經把上一次留下的 key 給彈出了)
// 所以棧已經恢復到進入這個函數時的狀態
return data;
}