1

在我的 CI 中创建一个全局元表:

luaL_newmetatable(L, "WebSocketClient");
lua_pushliteral(L, "close");
lua_pushcfunction(L, lws_sock_close);
lua_rawset(L, -3);
lua_pop(L, 1);

但在我的 Lua 中,我无法为其添加函数:

function WebSocketClient:read_frame()
   --foo
end

我收到此错误:

attempt to index local 'WebSocketClient' (a nil value)

如何使这个元表可用于我的 Lua 代码,以便向它添加更多功能?

4

2 回答 2

5

扩展 Bartek 的评论(这是正确的,虽然简短):如果您想从 Lua 向元表添加新功能,您需要将该表公开给 Lua。luaL_newmetatable 将您的 WebSocketClient 元表存储在Registry中,只能通过 C 访问(在调试 API 中的debug.getregistry之外,在对 Lua 代码进行沙盒处理时可能会删除它)。

您最好创建一个普通表,通过 C 库的表导出它,然后使用luaL_setmetatable(来自 C)或 setmetatable(来自 Lua)——将注册表视为将值放入 C 模块内部的地方。

您使用 luaL_newmetatable 的方式定义了一个元表,出于安全原因,该元表不应该从 Lua 中访问,因此例如 Lua 脚本最终用户不能弄乱核心类型的元表。在其他情况下很有用,但不是你想要的。

于 2013-05-16T15:56:52.130 回答
2

根据@silentbicycle 的回答提供代码:

lua_newtable(L);
lua_pushliteral(L, "close");
lua_pushcfunction(L, lws_sock_close);
lua_rawset(L, -3);
lua_setglobal(L, "WebSocketClient");

作为参考,您可以像这样设置元表:

lua_newtable(L);
lua_newtable(L);
lua_pushliteral(L, "__index");
lua_getglobal(L, "WebSocketClient");
lua_settable(L, -3);
lua_setmetatable(L, -2);
lua_settable(L, -3);
于 2013-05-16T16:48:45.013 回答