Lua學習筆記之淺談Lua的元表

目錄

1、博客介紹

2、內容

什麼是元表:

元表的作用:

元表的設置和獲取:

表和元表的查找關係:

元方法的用途:

3、推送

4、結語


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所創,推薦一下!我也在羣裏!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章