1. 程式人生 > 其它 >十分鐘學會Lua五:語言特性之元表與元方法

十分鐘學會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,其也有對應的元方法,我們可以修改表被遍歷的方式和為不是表的物件增加遍歷的方式。