Lua語言學習之元表與元方法

2021-06-22 23:00:58 字數 2051 閱讀 8362

元表與元方法

在學習table的時候已經提到這兩個概念。其實,可以把這兩個概念和c++中的運算子過載進行比較,

在功能上確有相似性。例如,c++中自定義的型別不能進行數**算,但是我們可以過載運算子就可以

進行數**算操作。lua中就是用元表和元方法來實現這個功能的。

lua中的 table 都可以有元表,我們可以用 getmetatable 這個函式來得到乙個 table 的元表,

可以用 setmetatable 這個函式來

設定乙個 table 的元表。

t = {}

print(getmetatable(t)) --> nil

table預設元表是空的,可以通過setmetatable 函式來改變其元表。

t1 = {}

setmetatable(t, t1)

print(getmetatable(t) == t1) ---> true

表的行為都是通過元方法來實現的,元方法主要分為以下幾種:

一、算術運算的元方法

1. __add  對應 + 運算,只要我在元表中實現 __add 方法就能對錶進行加操作。 

2. __mul  對應 * 運算,只要我在元表中實現 __mul 方法就能對錶進行加操作。

3. __sub  對應 - 運算,只要我在元表中實現 __sub 方法就能對錶進行加操作。

4. __div   對應 / 運算,只要我在元表中實現 __div 方法就能對錶進行加操作。

5. __unm 對應 - ( 求相反數運算)運算,只要我在元表中實現 __unm 方法就能對錶進行加操作。

6. __pow 對應 + 運算,只要我在元表中實現 __pow 方法就能對錶進行加操作。

另外,還可以定義 __concat 字段,用於描述連線操作符的行為。當然這些方法要在元表中定義。

set = 

function set.union (a, b)

local res = set.new

for k in pairs(a) do

res[k] = true

endreturn res

endlocal mt =

mt.__add = set.union

function set.new( l )

local set =

setmetatable( set, mt )

for _, v in ipairs( l ) do

set[ v ] = true

endreturn set

end

上面的**演示了如何讓兩個 table 也能相加的操作。其他操作類似,都是把元表中的相對應字段與自定義的

行為相關聯即可。

二、關係類的元方法

能夠定義元方法的關係操作符有 ==、< 和 <= ,其他三個關係操作符沒有單獨的元方法,

而是通過轉化來實現的,如 a ~= b 轉化為 not ( a == b )。

對應的元方法為:__eq ( 等於 )、__lt ( 小於 ) 和 __le ( 小於等於 ).

實現方法和算術類元方法類似。

三、庫定義的元方法

1. tostring 它能將各種型別的值表達為一種簡單的文字格式。

四、table訪問的元方法

前面已經介紹了table行為的一些元方法,如:__index 和 __newindex

1.  __index 元方法

當檢索 table 中不存在的字段時會呼叫這個方法。

我們可以把 __index 定義為乙個函式,也可以定義為乙個 table, 當定義為乙個 table 時,

lua 會在該 table 中查詢 __index 方法。

2.  __newindex元方法 

__newindex 和 __index 類似,它是在給 table 中不存在的字段賦值時呼叫,其他用法都一樣。

通過元表和元方法,我們可以寫出很複雜的功能,lua 中的物件導向就是通過這兩個技術來實現的。

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....