元表與元方法
在學習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....