【发布时间】:2018-11-23 12:14:14
【问题描述】:
经过多次尝试和数小时的谷歌搜索,我终于意识到 SOF 可能是我解决这个问题的最佳场所。
我目前正在使用 Lua C API 创建一个扩展,这是一个共享库,您可以通过 require 要求它来使用它。我正在尝试做与此非常相似的事情(对格式感到抱歉):
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 代码如下所示:
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;
}
并以此为例:
local rpc = require "DiscordRPC"
print(rpc['a'])
rpc.initialize();
现在显然 rpc['a'] 会返回 nil(是的 lua_index 确实运行)因为 lua_index 没有做任何事情但为什么我不能打电话给 initialize?它显然在那里。它说:lua: main.lua:5: attempt to call a nil value (field 'initialize') 所以它是零。如果我要删除lua_setmetatable(lua, 1);,我将能够调用该函数,但我无法按我的意愿索引它DiscordRPC。另外我想指出,当我删除它时,__index 元方法会被调用两次,显然会。
我的问题:我怎样才能做到这一点?我正在尝试在表上设置一个元表并返回整个元表。 非常感谢任何帮助,因为我完全迷路了。谢谢。
【问题讨论】:
-
这个问题好像和c++没什么关系。
-
代码编译为 C++,我确实使用了一些 C++ 头文件以及
extern C。我想我不妨添加它。