2012-03-30 53 views
2

我正在使用userdata在Lua中使用metatables傳遞事件並調用C++。我想知道是否輕用戶數據可以幫助我解決一些問題。lua中輕型用戶數據的用例?

light userdata是一個void *,但在lua中你不能對它做任何事情,至少這是我的理解,你可以通過函數調用?將它傳遞迴C。

你如何使用light userdata?如果任何人有一些用例,他們會用它來幫助我解決問題。

TIA

回答

3

我覺得Programming In Lua解釋了它相當不錯:

真正使用光用戶數據來自於平等。作爲一個完整的用戶數據是一個對象,它只是等於它自己。另一方面,light userdata代表一個C指針值。因此,它等同於表示相同指針的任何用戶數據。因此,我們可以使用light userdata在Lua中查找C對象。

作爲一個典型的例子,假設我們正在實現一個在Lua和Window系統之間綁定的 。在這個綁定中,我們使用完整的用戶數據來表示 。 (每個userdatum可能包含整個窗口 結構或僅指向由系統創建的窗口的指針。)當 窗口內有事件(例如,鼠標單擊)時,系統 調用特定的回調,標識窗口的地址。要將 傳遞給Lua,我們必須找到代表 給定窗口的userdata。爲了找到這個用戶數據,我們可以保留一個表,其中 索引是用戶數據較少的窗口地址,值 是表示Lua中窗口的完整用戶數據。一旦我們有 一個窗口地址,我們將它作爲一個light userdata 推入到API堆棧中,並使用userdata作爲該表的索引。 (注意,表 應該有微弱的價值觀,否則,那些充滿用戶數據將永遠 收集。)

該頁面還解釋說,光用戶數據不收集所以內存管理必須由您的代碼來完成垃圾。在我看來,用例實際上相當有限,這可能是你找不到很多例子的原因。我沒有找到one example

我有一個構建從LUA 表中的GUI對象(樹視圖)的程序。然後我有一個單獨的lua表格,以每個樹節點的窗口句柄 作爲lightuserdata索引。這簡化了界面 - 我可以使用c句柄來查找適當的lua表 對象。

// save a window handle 
lua_pushlightuserdata(L, hKey); 
lua_pushvalue(L,filt); // copy of filter table entry 
lua_settable(L, treeindex); 


// find data for a window handle 
lua_pushstring(L, "__treeitems"); 
lua_gettable(L, LUA_GLOBALSINDEX); 
lua_pushlightuserdata(L, hKey); 
lua_gettable(L, -2); 
+0

哦,好的,謝謝,我以爲我錯過了一些東西。 – daven11 2012-03-30 09:09:21

1

一個典型的使用情況是,當你LUA嵌入到另一個應用程序,你想給LUA作者令牌(在光用戶數據的形式),他們可以通過您設置的API向上。這是一個具體的例子。

說你提供了以下API中LUA的人,朋友們:通過您的綁定

GetPersonCount() // returns a number 
GetPerson(index) // returns a light user data - a pointer to the C++ version 

這將讓您訪問「朋友」的對象,這些將採取GetPerson的返回值(或下面的GetFriend)作爲參數。

GetFirstName(person) 
GetLastName(person) 
GetFriendCount(person) 
GetFriend(person, index) // would also return user data like GetPerson 

如果你已經用C生成的程序++用於獲取有關朋友的信息這是有用的,但你想讓它提供給人們寫在Lua腳本通過更加簡單和有限的界面,可在運行時安全地訪問,無需編譯或源代碼。