2013-08-21 9 views
6

Vorrei utilizzare l'esempio semplice della tabella ordinata, che ho trovato nel sito lua-wiki. Ecco the link.Iterare una tabella lua in c con una funzione di coppia personalizzata

In Lua si itera bene con questo:

for i,v in t:opairs() do 
    print(i,v) 
end 

Invece l'iterazione in lua, voglio passare t a un metodo C e iterare il tavolo. Nell'API C ho trovato solo lua_next per l'iteratore pairs originale. Come posso ripetere questo codice lua in C?

risposta

2

Quello che puoi fare è scrivere una funzione personalizzata next C che simula lua_next ma funziona su quella tabella ordinata invece che ha il metodo opairs.

int luaL_orderednext(luaState *L) 
{ 
    luaL_checkany(L, -1);     // previous key 
    luaL_checktype(L, -2, LUA_TTABLE); // self 
    luaL_checktype(L, -3, LUA_TFUNCTION); // iterator 
    lua_pop(L, 1);      // pop the key since 
             // opair doesn't use it 

    // iter(self) 
    lua_pushvalue(L, -2); 
    lua_pushvalue(L, -2); 
    lua_call(L, 1, 2); 

    if(lua_isnil(L, -2)) 
    { 
    lua_pop(L, 2); 
    return 0; 
    } 
    return 2; 
} 

È quindi possibile utilizzarlo in C simile a lua_next:

int orderedtraverse(luaState *L) 
{ 
    lua_settop(L, 1); 
    luaL_checktype(L, 1, LUA_TTABLE); 

    // t:opairs() 
    lua_getfield(L, 1, "opairs"); 
    lua_pushvalue(L, -2); 
    lua_call(L, 1, 2); 

    // iter, self (t), nil 
    for(lua_pushnil(L); luaL_orderednext(L); lua_pop(L, 1)) 
    { 
    printf("%s - %s\n", 
      lua_typename(L, lua_type(L, -2)), 
      lua_typename(L, lua_type(L, -1))); 
    } 
    return 0; 
} 

nota, non ho la prova questo, ma dovrebbe funzionare.

Problemi correlati