十分鐘學會Lua五:語言特性之元表與元方法
元表和元方法:對於表,我們可以使用元表和對應的元方法來定義表之間的操作,如算術操作、關係操作等等。Lua在建立表時,預設不帶元表,可以使用函式setmetatable 來設定或修改任意表的元表,使用函式getmetatable來查看錶:
t1 = {}
setmetatable(t, t1)
print( getmetatable(t) == t1)--> true
1、表的算數運算:Lua已經為我們規定好了各種算術操作符的元方法名稱,
__add |
加法 |
__sub |
減法 |
__mul |
乘法 |
__div |
除法 |
__idiv |
floor除法 |
__unm |
負數 |
__mod |
取模 |
__pow |
冪運算 |
_-band |
按位與 |
__bor |
按位或 |
__bxor |
按位異或 |
s1=Set.new{10,30,40,50} s2= Set.new {10,30,20,40,50} --先定義兩個表
setmetatable(s1,mt)
setmetatable(s2,mt) --為兩個表建立相同的元表。
mt.__add=Set.union --定義元方法,一般格式為mt.__add=function()
s3=s1+s2 --s1和s2相加,呼叫相加的元方法,即呼叫函式Set.union求兩表的並集
print(Set.tostring(s3)) -->{10,20,30,40,50}
當然,我們可以修改用於建立集合的函式Set.new,讓所有表示集合的表共享一個元表,即將mt設定為函式Set.new所建立的表的元表:
function Set.new (l)--第二個版本
local set = {f}
setmetatable(set,mt)
for _, v in ipairs(l) do
set[v] = true
end
return set
end
在此之後,所有由Set.new建立的集合都具有了一個相同的元表。
2、表的關係運算
元表關於關係運算的元方法有:
__eq |
等於 |
__lt |
小於 |
__le |
小於等於 |
其他三個關係運算符沒有單獨的元方法,Lua語言會將a~=b 轉換為not (a==b),a>b 轉換為b<a,a>=b 轉換為b<=a。
3、庫定義相關元方法
這裡介紹兩個庫定義相關元方法,一個是“__tostring”,將表表示為字串;還有一個是函式pairs,其也有對應的元方法,我們可以修改表被遍歷的方式和為不是表的物件增加遍歷的方式。