假设我们有一个传递给函数的表,它现在位于堆栈顶部,如下所示:
// -1 = table
是否有可能从堆栈中的表中获取metatable?我可以简单地使用如下的已知名称标识符来获取它:
luaL_getmetatable(L, "Foo");
但是我想重新使用该函数并从堆栈中的表中获取元数据。
可能有一种简单的方法可以做到这一点,但我似乎找不到这个功能。
答案 0 :(得分:5)
使用lua_getmetatable
而不是luaL_getmetatable
。 lua_
版本等同于Lua中的getmetatable()
,即它从堆栈中的值获取元数据。 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并在值为1时推送metatable,如果没有metatable则返回0并推送 nothing - 而不是将nil推送为,例如,lua_getglobal
会这样做。