lua表格模拟

时间:2011-05-10 15:19:59

标签: c++ lua luabind

美好的一天

我有一个特定的任务,可以访问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函数进行访问。

2 个答案:

答案 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?