2013-07-27 78 views
3

我正在使用Lua作爲腳本語言編寫的使用C++編寫的項目。 爲了便於調試,我們實現了一個網絡調試器,它接收Lua代碼,運行它,在Json中對返回值進行編碼並將該字符串發送回去。從C api訪問userdata中的Lua變量

我設法實現了表,但現在我卡在存儲在userdata中的變量。 例如我有這樣的Lua代碼:

Elements.Avatar.testVar = 5 

Elements.testVar = 15 

return Elements  

// result 
{ 
    "result0": "{Application:userdata; Avatar:userdata; Physics:userdata; testVar:15; }" 
} 

ApplicationAvatarPhysics是已經用C創建的對象++。然而,兩個testVars已在上面的腳本中創建。 Elements是一個表,所以我可以列出所有元素,但Avatar.testVar似乎被隱藏,因爲AvatarLUA_TUSERDATA

有沒有人有一個想法如何我可以檢測已添加到用戶數據在Lua中的變量?

回答

2

不存在「存儲在用戶數據中的變量」這樣的事情,至少,並不像Lua那樣。從Lua的角度來看,userdata是一個巨大的黑盒子。所有Avatar.testVar = 5確實是調用Avatar中的元方法__newindex,其中字符串testVar和新值15。你的C++ metamethod(因爲只有C++代碼可以將元方法放在userdata上)解釋爲完全是直到你的代碼。

所以它不能從Lua完成。您的代碼需要提供調試掛鉤。 Lua 5.2允許您實現__pairs__ipairs元方法,其中pairsipairs函數可用於迭代您的值。除此之外,您可以自行查詢用戶數據中是否存在和不存在的內容。

+0

好的,這是非常有幫助的。我試圖從C++端列出這些值,所以這不是問題。我正在使用OOLUA來使實現lua變得更容易,並且這導致我認爲將值存儲在用戶數據對象旁邊的選項是該語言的固有選項。 這意味着我必須檢查OOLUA提供的綁定代碼,以瞭解如何存儲我的Avatar.testVar? –

+0

@ user2626359:那麼,大概'testVar'是在你使用OOLUA公開的任何C++類中的C++變量的名稱,是的? –