美好的一天
我有一个特定的任务,可以访问lua脚本来访问c ++ std :: map。所需的脚本语法是glob [“tag”] =“value”或glob(“tag”)=“value”
在研究中,尝试过luabind绑定
std::string & glob(const std::string &tag)
{
static std::string value;
return value;
}
...
luabind::module(&state)
[
def("glob", &glob, luabind::return_reference_to(result))
]
但是在下面列出的脚本运行之后
glob("tag") = "asdasd"
print(glob("tag"))
得到错误[string“glob(”tag“)=”asdasd“...”]:1:'='附近的意外符号
所以,我在等你的建议和意见。
由于
更新 2lhf:通过c ++部分存储和序列化的全局变量数据,必须从lua访问。 luaState是按脚本执行创建的,在执行之间不存在。其中一个解决方案是在脚本执行之前创建并填充全局变量表,并在执行后将其与map同步,但是,我认为它足够慢。因此,将通过提及语法的c函数进行访问。
答案 0 :(得分:3)
glob("tag") = "asdasd"
永远无法工作,因为它不是有效的Lua语法。 glob["tag"] = "value"
可以运作。您需要将glob
设置为带有索引和 newindex 元方法的用户数据。我对luabind一无所知,所以我无法帮助你。但使用标准的Lua API进行操作并不难。我只是想知道为什么你需要将C ++ map 导出到Lua,当Lua已经拥有出色的关联数组时。
答案 1 :(得分:0)
是的,易于理解的规则。
只需插入一些来自样本的c代码
lua_createtable(&state, 0, 0);
lua_pushcfunction(&state, &getValue);
lua_setfield(&state, -2, "__index");
lua_pushcfunction(&state, &setValue);
lua_setfield(&state, -2, "__newindex");
lua_setmetatable(&state, -2);
lua_setglobal(&state, "global");
一切正常,谢谢
但这是另一个问题:为什么我应该使用index == -2 for lua_setfield和lua_setmetatable?