日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

lua元表的理解

發布時間:2023/12/13 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 lua元表的理解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
元表概念 ( Metatable)
? 元表由鍵名為 事件 (event) 和其中的值叫作元方法 (metamethod)組成。
?
? 在lua中每個值都有一個元表。而table和userdata所定義的值允許自定義對應的元表,
? 其他都是用統一的元表。

? 我的理解,元表,其實有點類似 值的屬性的味道。

對元表的操作
getmetable 查詢元方法
setmetable 替換元方法。

metatable 包含幾個固定的元方法.
?? 其事件名由下劃線 '__' 前綴的字符串組成。

"add": + 操作。
"sub": - 操作。 其行為類似于 "add" 操作。
"mul": * 操作。 其行為類似于 "add" 操作。
"div": / 操作。 其行為類似于 "add" 操作。
"mod": % 操作。 其行為類似于 "add" 操作,它的原生操作是這樣的 o1 - floor(o1/o2)*o2
"pow": ^ (冪)操作。 其行為類似于 "add" 操作,它的原生操作是調用 pow 函數(通過 C math 庫)。
"unm": 一元 - 操作。
"concat": .. (連接)操作,
"len": # 操作。
"eq": == 操作。
a ~= b 等價于 not (a == b) 。
"lt": < 操作。
"le": <= 操作。
a >= b 等價于 b <= a 。注意,如果元方法 "le" 沒有提供,Lua 就嘗試 "lt" ,它假定 a <= b 等價于 not (b < a)

"index": 取下標操作用于訪問 table[key] 。
"newindex": 賦值給指定下標 table[key]= value 。
"call": 當 Lua 調用一個值時調用。


以上事件中,index 和newindex 很關鍵,常常被自定義的函數所取代。

如:定義一個函數取代環境中的處理
local f = function (t,i)
? error("cannot redefine global variable `"..i.."'",2)
end

local g = {}
local G = getfenv()
setmetatable(g,{__index=G,__newindex=f})

--設置g的運行環境
setfenv(1,g)
rawset(g,"x",3)

x=2
y=1 -- cannot redefine 'y'

以上的替換只能在C下改變,在lua中不能中改變其它任何類型的值的 metatable(debug 庫例外);

值得說明的是:
table 和userdata類型擁有獨立的 metatable (也可以共享一個相同的表作它們的 metatable)

在lua的擴展庫函數中有一個
luaL_newmetatable
這個函數是創建一個表,作為元表提供給userdata使用。
(userdata,可以理解為自定義的一個數據結構。)

ta={1,3,5}
tb={2,4,6}

tm ={};

tm.__add = function(a,b)
?for _, item in ipairs(b) do
??table.insert(a,item);
?end
??? return a;
end

setmetatable(ta,tm)
sum = (ta + tb);

for v,j in ipairs(sum) do
??? print (v,j);
end
a =rawget(ta, 5)
print (a)

總結

以上是生活随笔為你收集整理的lua元表的理解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。