目錄
1、博客介紹
本篇文章作爲Lua的學習筆記,淺談Lua元表的相關內容,主要內容包括,元表是什麼,元表怎麼用和一些元方法的用途,知識點有從菜鳥教程內摘抄,讀者可以直接跳轉菜鳥教程Lua元表的相關內容查看,博文底部設有傳送門。
2、內容
什麼是元表:
元表就是表,這個表有默認的元方法和自定義方法屬性,並可以作爲另外一個表的描述,這個表可以稱爲元表
元表的作用:
mytable = {}
mymetatable = {}
當你將表mymetatable設置爲mytable表的元表之後,mytable就可以享有mymetatable所有的屬性和方法,好比繼承,當你調用mytable內的屬性或者方法時,如果找不到,則會去其元表內再次查找,如果對錶進行一些算數運算,則會觸發元表內相關的一些默認元方法
元表的設置和獲取:
mytable = {} -- 普通表
mymetatable = {} -- 元表
setmetatable(mytable,mymetatable) -- 把 mymetatable 設爲 mytable 的元表
getmetatable(mytable) -- 這回返回mymetatable
mytable = setmetatable({},{})
我們可以通過setmetatable將一個表設置爲另一個表的元表,該方法返回一個以mymetatable爲元表的表,所以可以直接簡寫成mytable = setmetatable({},{})的形式,我們也可以通過getmetatable來獲取一個表的元表,這個元表可以爲nil。
表和元表的查找關係:
mytable = {}
mymetatable = {}
setmetatable(mytable,mymetatable)
mymetatable.__index = mymetatable
mymetatable.key2 = 100
print(mytable.key2)
--------------------------輸出
100
元表有一些默認的元方法和一些屬性,這些方法屬性都是以兩個下橫槓開頭(__),在這裏講一個元表最重要的默認屬性__index,__index可以設置爲任意數據類型,方法或者表都可以,這裏我們要強調一點調用屬性後的查找順序,如上述代碼所示,我們如果去調用mytable內的一個屬性key2,我們會發現,mytable內並沒有key2這個屬性,然後會再去mytable的元表mymetatable內查找key2,這裏其實並不是直接在mymetatable內去查找key2,而是在mymetatable的屬性__index內去查找,所以上述中我將__index設置爲了mymetatable本身,這樣就可以找到mymetatable內的屬性key2
查找順序:
1、先在mytable內查找是否存在key2,若存在則返回
2、mytable內不存在key2則先尋找mytable是否存在元表,不存在則結束
3、mytable內存在元表mymetatable,在mymetatable內的__index內查找key2,如存在返回,不存在結束
元方法的用途:
local mytable1 = {1,2,3}
local mytable2 = {4,5,6}
print(mytable1 + mytable2)
如上述代碼所示,正常情況下,我們是不能對兩個表直接進行加減乘除的運算的,會報錯,但是如果有元表存在,碰到運算符則會觸發元表內的一些元方法,就比如+法會觸發元表內的__add方法。
local mytable1 = {1,2,3}
local mytable2 = {4,5,6}
mymetatable = {}
setmetatable(mytable2,mymetatable)
function mymetatable:__add(table1,table2)
return 1
end
print(mytable1 + mytable2)
-------------------------輸出
1
如上述代碼所示,若是存在表和表的相加行爲,則會按照相加的順序來判斷表是否具有元表,具有元表的話,元表內是否存在元方法__add,然後會調用第一個查找到的__add方法,__add方法存在返回值,若都不存在元表或元表內都不存在__add方法,則編譯不通過,下方羅列了一些運算相關的元方法,還有一些非運算相關的元方法讀者可以參考菜鳥教程。
__add | 對應的運算符 '+'. |
__sub | 對應的運算符 '-'. |
__mul | 對應的運算符 '*'. |
__div | 對應的運算符 '/'. |
__mod | 對應的運算符 '%'. |
__unm | 對應的運算符 '-'. |
__concat | 對應的運算符 '..'. |
__eq | 對應的運算符 '=='. |
__lt | 對應的運算符 '<'. |
__le | 對應的運算符 '<='. |
3、推送
Github:https://github.com/KingSun5
菜鳥教程Lua元表:https://www.runoob.com/lua/lua-metatables.html
4、結語
元表的作用很廣泛,其中一點就是實現繼承的方式用作模擬面向對象,本篇博客講到這裏,若是覺得博主的文章寫的不錯,不妨關注一下博主,點贊一下博文,另博主能力有限,若文中有出現什麼錯誤的地方,歡迎各位評論指摘。
QQ交流羣:806091680(Chinar)
該羣爲CSDN博主Chinar所創,推薦一下!我也在羣裏!