2013-05-28 66 views
2

我在lua中有一個接受userdata對象的函數。如何將對錶的引用添加到userdata對象?

function Class:AttachToUserdataObject(userdataObject) 
    userDataObject.tableAttached = self 
end 

但後來,當我使用相同的用戶數據對象,我不能找到它 - userdataObject.tableAttached是零。我覺得我不完全理解用戶數據對象的工作方式。

是否有綁定的對象的任何方式比創建擁有所有用戶數據對象的ID的全局表到用戶數據等(它們具有獨特的ID)和引用表?

我想保持它作爲優雅盡我所能,但沒有進入C++代碼,我想我可以犧牲一些優美,如果它只是工作。

+1

[debug.setuservalue](http://www.lua.org/manual/5.2/manual.html#pdf-debug.setuservalue) – finnw

回答

3

一個用戶數據對象不具有像一個表中的字段和Lua沒有任何知識對底層C物體的內部結構。爲了達到你想要的,你必須處理__index__newindex metamethods。

因此,例如,在執行像userdataObject.tableAttached = self這樣的分配時,會觸發__newindex元方法。在它內部,您可以將值存儲在metatable本身(受可能的名稱衝突)或另一個表中,該表本身存儲在metatable中。

要檢索的數據後面,你必須處理__index元方法。它可能會對userdata有點棘手,所以讓我知道,如果你遇到問題。

+0

感謝您描述整個過程,而不僅僅是放棄代碼示例。我決定現在就去桌子上,因爲我想要做的事似乎搞亂了Lua的慣例。 – Nebril

2

你可以使用一個支持弱表代替:

local _data = setmetatable({}, {__mode='k'}) 

function Class:AttachToUserdataObject(userdataObject) 
    _data[userDataObject] = self 
end 
+0

我真的希望你在這裏給出一個更完整的例子,我已經有一個與userdata一起工作的系統,但現在認爲用一個用戶數據metatable支持的真正表格會更好。 –