Lua C Extension: how to set metatable on new library
经过多次尝试和数小时的谷歌搜索,我终于意识到 SOF 可能是我解决这个问题的最佳场所。
我目前正在使用 Lua C API 创建一个扩展,这是一个共享库,您可以通过
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | local data = { something ="some" } local rpc = {} function rpc.method() print('ran') end function rpc.method2() print('ran222') end local metatable = {} metatable.__index = function(self, key) return data[key] end setmetatable(rpc, metatable) -------------------------------------------- rpc.method() print(rpc['something']) rpc.method2() |
我当前的 C 代码如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | static int lua_index(lua_State* lua) { //idk std::cout <<"Was indexed"; const char* a = luaL_checkstring(lua, 2); std::cout << a << std::endl; return 0; } static int lua_initialize(lua_State* lua) { std::cout <<"ran"; return 0; } static const struct luaL_Reg lib[] = { {"initialize", lua_initialize }, {"__index", lua_index}, { NULL, NULL } }; extern"C" int DISCORD_RPC_EXPORT luaopen_DiscordRPC(lua_State* lua) { luaL_newlib(lua, lib); lua_setmetatable(lua, 1); return 1; } |
并以此为例:
1 2 3 4 5 | local rpc = require"DiscordRPC" print(rpc['a']) rpc.initialize(); |
现在显然
我的问题:我怎样才能做到这一点?我正在尝试在表上设置一个元表并返回整个元表。
非常感谢任何帮助,因为我完全迷路了。谢谢。
您必须通过将元表推到堆栈顶部然后调用
来将元表设置到您的表中
1 2 3 | luaL_newlib(lua, lib); lua_pushvalue(lua, -1); lua_setmetatable(lua, -2); |
对
通过这样做并运行您的示例,我得到了以下结果:
1 2 3 4 5 6 7 | local rpc = require"DiscordRPC" print(rpc['a']) -- First, calls the __index function, printing -- 'Was indexeda' -- Then prints nil, since the key 'a' holds nothing rpc.initialize(); -- Prints ran |
如果你对此有更多疑问,我建议你阅读 Lua Book 中关于用户数据和面向对象访问的章节。