引用metatable从Lua 5.1.5创建的C语言

mxc*_*xcl 1 lua

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

luaL_newmetatable(L, "WebSocketClient");
lua_pushliteral(L, "close");
lua_pushcfunction(L, lws_sock_close);
lua_rawset(L, -3);
lua_pop(L, 1);
Run Code Online (Sandbox Code Playgroud)

但是在我的Lua中我无法添加一个函数:

function WebSocketClient:read_frame()
   --foo
end
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

attempt to index local 'WebSocketClient' (a nil value)
Run Code Online (Sandbox Code Playgroud)

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

sil*_*cle 5

扩展Bartek的注释(这是正确的,虽然简短):如果你想从Lua向metatable添加新函数,你需要将该表暴露给Lua.luaL_newmetatable将您的WebSocketClient元表存储在注册表中,只能通过C访问(调试API中的debug.getregistry之外,可以在沙箱Lua代码时删除).

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

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