Lua C API - получение метатаблицы из таблицы в стеке

Допустим, у нас есть таблица, которая была передана функции, и теперь она находится на вершине стека, например:

// -1 = table

Можно ли получить метатаблицу из этой таблицы в стеке? Я могу просто получить его с известным идентификатором имени, например:

luaL_getmetatable(L, "Foo");

Но я хочу повторно использовать функцию и получить метатаблицу из таблицы, которая находится в стеке.

Вероятно, есть простой способ сделать это, но я не могу найти функцию для этого.


person Grapes    schedule 27.09.2013    source источник


Ответы (1)


Используйте lua_getmetatable вместо luaL_getmetatable. Версия lua_ эквивалентна getmetatable() в Lua, т. е. она получает метатаблицу из значения в стеке. Версия luaL_ предназначена для поиска (по имени) метатаблиц, зарегистрированных ранее с помощью luaL_newmetatable.

В вашем случае это будет просто:

// push the table
lua_getmetatable(L, -1);
// table is still on the stack at -2
// its metatable on top of it at -1

Обратите внимание, что lua_getmetatable() возвращает 1 и помещает метатаблицу, если она есть, и возвращает 0 и не помещает ничего, если у нее нет метатаблицы, а не nil, как, например, lua_getglobal.

person ToxicFrog    schedule 27.09.2013