创建于Lua 5.1.5中的C元表引用。

在我的 C 代码中,我创建了一个全局元表:

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 代码中,以便我可以向其添加更多函数?

点赞
用户172486
用户172486

扩展Bartek的评论(虽然简洁但正确):如果你想要从Lua中向元表添加新的函数,你需要将该表暴露给Lua。luaL_newmetatable将WebSocketClient的元表存储在Registry中,该Registry只能通过C语言访问(除了调试API中的debug.getregistry,但在沙盒化Lua代码时可能会被删除)。

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

你正在使用luaL_newmetatable的方式明确地定义了一个元表,该元表由于安全原因明确不应从Lua中访问,以便Lua脚本的最终用户不能干扰核心类型的元表。虽然对于其他情况有用,但不是你想要的。

2013-05-16 15:56:52
用户6444
用户6444

根据 @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-16 16:48:45