Клонирование таблицы Lua в Lua C API - PullRequest
5 голосов
/ 26 декабря 2010

Существует множество примеров того, как клонировать таблицу Lua в Lua, однако я не смог найти ни одного примера того, как это сделать с помощью встроенного API Lua C.Я пытался сделать это вручную дважды, но в итоге получился настоящий (хотя и работающий) беспорядок.

Есть ли у кого-нибудь какие-либо советы или ссылки о том, как элегантно сделать мелкую копию таблицы Lua в C API?

1 Ответ

8 голосов
/ 27 декабря 2010

Что вам нужно сделать, это определить функцию Lua, а затем разбить ее на связанные вызовы API.

shallow_copy = function(tab)
    local retval = {}
    for k, v in pairs(tab) do
        retval[k] = v
    end
    return retval
end

Итак, нам нужно взять индекс таблицы в стеке и lua_State.

void shallow_copy(lua_State* L, int index) {

/*Create a new table on the stack.*/

        lua_newtable(L);

/*Now we need to iterate through the table. 
Going to steal the Lua API's example of this.*/

        lua_pushnil(L);
        while(lua_next(L, index) != 0) {
/*Need to duplicate the key, as we need to set it
(one pop) and keep it for lua_next (the next pop). Stack looks like table, k, v.*/


            lua_pushvalue(L, -2);
/*Now the stack looks like table, k, v, k. 
But now the key is on top. Settable expects the value to be on top. So we 
need to do a swaparooney.*/

            lua_insert(L, -2);

    /*Now we just set them. Stack looks like table,k,k,v, so the table is at -4*/



    lua_settable(L, -4);

/*Now the key and value were set in the table, and we popped off, so we have
table, k on the stack- which is just what lua_next wants, as it wants to find
the next key on top. So we're good.*/

        }
    }

Теперь наша скопированная таблица находится на вершине стека.

Боже, API Lua отстой.

...