Lua 學習筆記(十一)元表與元方法

2022-03-25 01:50:37 字數 2594 閱讀 9707

在lua中的每個值都有一套預定義的操作集合。例如可以將數字相加,可以連線字串,還可以在table中插入一對key-value等。但是我們無法將兩個table相加,無法對函式作比較,也無法呼叫乙個字串。

但是,lua提供了元表與元方法來修改乙個值的行為,使其在面對乙個非預定義的操作時執行乙個指定的操作。例如,假設a和b都是table,通過元表可以定義如何計算表示式a+b。當lua試圖將兩個table相加時,它會先檢查兩者之一是否有元表,然後檢查該元表中是否有乙個叫__add的字段。如果找到了該字段,就呼叫該欄位對應的值。這個值也就是所謂的」元方法「,它應該是乙個函式,用於計算table的和。

lua在建立乙個新的table時不會建立元表。因此有兩個函式可以獲取與設定元表:

setmetatable( t1,t2 ) 設定t1的元表為t2。

getmetatable( t ) 獲取t的元表。

任何table都可以作為任何值的元表,而一組相關的table也可以共享乙個通用的元表,此元表描述了它們共同的行為。乙個table甚至可以作為它自己的元表,用於描述其特有的行為。總之,任何搭配形式都是合法的。

在lua中可以定義值的行為,那麼就有相應的元方法:算術類的元方法、關係類的元方法、庫定義的元方法以及table訪問的元方法。

1、算術類的元方法:__add(加)、__sub(減)、__mul(乘)、__div(除)、__unm(相反數)、__mod(取模)、__pow(乘冪)、__concat(連線操作符)

2、關係類的元方法:__eq(等於)、__lt(小於)、__le(小於等於)

3、庫定於的元方法:__tostring(print時呼叫)、__metatable(設定後不可修改元表)

4、table訪問的元方法:__index(查詢table)、__newindex(修改table的字段)、__mode(弱引用table)

在對table使用算術操作符時,lua回去查詢有沒有操作符對應的元方法,如果有則呼叫算術類元方法,否則會產生錯誤資訊。如 

table1 = 

table2 =

print( table1 - table2 ) --

產生錯誤:attempt to perform arithmetic on global 'table1' (a table value)

如果設定了元表及元方法,就可以按照自己的意願去處理(減法求值的例子):

關係類的元方法在使用上同算術類的元方法一樣,都是在有操作符操作時去查詢元方法,其中有三個關係操作符沒有單獨的元方法,lua會把

1、a~=b   轉化為 not( a==b )

2、a>b     轉化為 b3、a>=b   轉化為 b<=a

庫定義的元方法的應用:__tostring

庫定義的元方法的應用:__metatable

table訪問的元方法:__index。當訪問乙個table中不存在的字段時,得到的結果為nil。這是對的,但並非完全正確。實際上,這些訪問會促使直譯器去查詢乙個叫__index的元方法。如果沒有這個元方法,那麼訪問結果就是nil,否則,就由這個元方法來提供最終的結果。

table訪問的元方法:__newindex。當對乙個table中不存在的索引賦值時,直譯器就會查詢__newindex元方法。如果有這個元方法,直譯器就呼叫它,而不是執行賦值。注意,lua中有乙個rawset(t,k,v)方法可以繞過元方法直接對table進行賦值。

通過table訪問的元方法,__index、__newindex搭配使用可以很輕易的實現物件導向。元方法在元表中設定,只有當table被設定為元表時,table中的元方法才會有效。

table訪問的元方法:__mode。設定table為弱引用table,並確定是key為弱引用或者value為弱引用。所謂若引用就是一種會被垃圾收集器忽視的物件引用。如果乙個物件的所有引用都是弱引用,那麼lua就可以**這個物件了,並且還可以以某種形式來刪除這些弱引用本身。lua用「弱引用table」來實現弱引用,乙個弱引用table就是乙個具有弱引用條目的table。如果乙個物件只被乙個弱引用table所持有,那麼最終lua是會**這個物件的。

乙個table的弱引用型別是通過其元表中的__mode欄位來決定的。這個欄位的值為乙個字串:'k'(table的key是弱引用)、'v'(table中value是弱引用)。只要有乙個key或value被**了,那麼它們所在的整個條目都會從table中刪除。

tab1 ={}

tab2 =

--tab1中的key將會是弱引用

setmetatable( tab1,tab2 )

lua元表與元方法

1.首先我們先了解下lua的表 2.元表 是用來定義對table操作的方式表 我們先來看一下問題 t1 t2 我們把這兩張錶拼起來 第一種方法 table.inster t1,t2 1 第二種方法 元表 mt 方法類似於c 的運算子過載可以看出我們過載的是 mt.add function t1,t2...

lua元表與元方法

lua中提供的元表 metatable 與元方法 metamethod 是一種非常重要的語法,metatable主要用於做一些類似於c 過載操作符式的功能。lua中提供的元表是用於幫助lua變數完成某些非預定義功能的個性化行為,如兩個table的相加,通過讓兩者指向同一元表並修改該元表的元方法可以實...

Lua初學習 9 13 03 元表與元方法

1 元表與元方法 a b setmetatable b,a 測試001 print a.age a age 18 print b.age nil 測試002 a.index a print a.age a age 18 print b.age a age 18 測試003 1 a.orz 99 b....