2011-05-10 53 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