1

再会

我有一个特定的任务是让 c++ std::map 访问 lua 脚本。所需的脚本语法是 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 是在每次脚本执行时创建的,并且在执行之间不存在。解决方案之一是在脚本执行之前创建和填充全局变量表,并在执行后将其与地图同步,但是,我认为它足够慢。因此,将不胜感激通过具有上述语法的 c 函数进行访问。

4

2 回答 2

3

glob("tag") = "asdasd"永远无法工作,因为它不是有效的 Lua 语法。 glob["tag"] = "value"能行得通。您需要使用indexnewindexglob元方法设置为用户数据。我对 luabind 一无所知,所以我无法帮助你。但是使用标准的 Lua API 做到这一点并不难。我只是想知道为什么你需要将 C++映射导出到 Lua,而 Lua 已经具有出色的关联数组。

于 2011-05-10T15:31:28.530 回答
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");

一切正常,谢谢

但这里还有一个问题:为什么我应该对 lua_setfield 和 lua_setmetatable 使用 index == -2?

于 2011-05-11T08:58:50.503 回答