【问题标题】:Table simulation for lualua的表模拟
【发布时间】:2011-08-22 14:01:34
【问题描述】:

美好的一天

我有一个特定的任务是让 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 函数访问将不胜感激。

【问题讨论】:

    标签: c++ lua luabind


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      是的,元表规则。

      只需插入一些从示例中获取的 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?

      【讨论】:

      • 因为表格可能处于 -2 位置,即从顶部开始在堆栈下方的两个位置。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-12
      • 2017-03-28
      • 2017-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-21
      相关资源
      最近更新 更多