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