2011-05-10 99 views
1

美好的一天lua的表模拟

我有一个特定的任务来给C++ std :: map访问lua脚本。所需的脚本语法是水珠[“标签”] =“值”或水珠(“标签”)=“值”

在研究中,已经尝试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")) 

遇到错误[字符串 “水珠(” 标签 “)= ”asdasd“ ...”]:1:意外的符号附近 '='

所以,我等待着您的建议和意见。

由于

更新 2lhf:全局变量的数据存储,并通过C++部分序列,并具有从LUA被访问。 luaState是每个脚本执行时创建的,并且在执行之间不存在。解决方案之一是在执行脚本之前创建并填充全局变量表,并在执行后将其与地图同步,但是,我认为它足够慢。所以,通过c函数访问提到的语法将不胜感激。

回答

3

glob("tag") = "asdasd"永远不能工作,因为它不是有效的Lua语法。 glob["tag"] = "value"可以工作。您需要将glob设置为索引newindex metamethods作为用户数据。我对拉巴林德一无所知,所以我无法帮助你。但是使用标准的Lua API来做并不难。我只是想知道为什么你需要导出C++ 地图到Lua,当时Lua已经有很好的关联数组了。

+0

请参阅我的文章中的更新部分 – Orange 2011-05-10 15:58:16

0

是的,metatable规则。

刚把插入来自样品

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"); 

一些C代码获取和一切工作得很好,感谢

但这里是另外一个问题:为什么要使用索引== -2 lua_setfield和lua_setmetatable?

+0

由于表格位于可能的-2位置,即位于堆栈顶部的两个位置。 – lhf 2011-05-11 21:52:11