【发布时间】:2013-10-03 04:24:07
【问题描述】:
假设我们有一个传递给函数的表,它现在位于堆栈顶部,如下所示:
// -1 = table
是否可以从堆栈中的该表中获取元表?我可以简单地使用这样的已知名称标识符来获取它:
luaL_getmetatable(L, "Foo");
但我想重用该函数并从堆栈中的表中获取元表。
可能有一种简单的方法可以做到这一点,但我似乎找不到为此的功能。
【问题讨论】:
假设我们有一个传递给函数的表,它现在位于堆栈顶部,如下所示:
// -1 = table
是否可以从堆栈中的该表中获取元表?我可以简单地使用这样的已知名称标识符来获取它:
luaL_getmetatable(L, "Foo");
但我想重用该函数并从堆栈中的表中获取元表。
可能有一种简单的方法可以做到这一点,但我似乎找不到为此的功能。
【问题讨论】:
使用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 时推送元表,如果没有元表则返回 0 并推送 nothing - 而不是推送 nil,例如, lua_getglobal 会。
【讨论】: