閱讀686 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Lua數據結構 — Udata(五)

作者:羅日健

Udata負責存儲userdata的數據,這部分其實很簡單,但是為了保證係列文章的完整性,還是寫一篇出來補全。

下麵是Udata的數據結構:

意義:

  1. CommonHeader:和與TValue中的GCHeader能對應起來的部分
  2. metatable:userdata的元表,和table的元表一樣的
  3. env:創建userdata時,會把當前執行語句的curenv賦給userdata的env,可修改
  4. len:使用userdata的時候綁定對象申請的空間大小

和TString類似,用戶綁定的C對象或數據內存緊跟在Udata後麵,在luaS_newudata中(lstring.c 96 – 110)有如下代碼:

lua-udata-structure-1

 

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

  上一篇:go Lua數據結構 — lua_State(六)
  下一篇:go Lua數據結構 — 閉包(四)