Lua數據結構 — Udata(五)
作者:羅日健
Udata負責存儲userdata的數據,這部分其實很簡單,但是為了保證係列文章的完整性,還是寫一篇出來補全。
下麵是Udata的數據結構:
意義:
- CommonHeader:和與TValue中的GCHeader能對應起來的部分
- metatable:userdata的元表,和table的元表一樣的
- env:創建userdata時,會把當前執行語句的curenv賦給userdata的env,可修改
- len:使用userdata的時候綁定對象申請的空間大小
和TString類似,用戶綁定的C對象或數據內存緊跟在Udata後麵,在luaS_newudata中(lstring.c 96 – 110)有如下代碼:
Udata元表(metable)的作用:
如果userdata沒有元表,那是使用起來將會很麻煩,有元表,可以在腳本這樣寫:
從C語言層麵來看,myuserdata這個變量其實隻是個指針,不像table那樣有子元素。但是因為有metatable,由此可以把成員\函數放到這個metatable中,在腳本中可以利用它來實現這個類似table的訪問方法。
Udata環境(env)的作用:
env這個成員,默認是存儲創建userdata時的環境table,而參考Lua官方的文檔後,其實這個env成員在Lua中並沒有使用,它的值時什麼並不影響Lua的運行。
這就說明這個成員目前來說是一個用戶可以自由操作的table,在UserDataRefinement文章中,告訴了我們一些使用的手段。另外一篇文章https://lua-users.org/lists/lua-l/2005-08/msg00709.html也對它的使用方法提出了一些建議。
我比較讚成後一篇文章的看法,對於Udata來說,metatable是一種靜態的類型數據(type-common data),而env則是實例相關的數據(instance-local data)。當然了,怎麼用取決於使用者。
最後更新:2017-04-03 08:26:25