lua學習之MetaTable 和 MetaMethod(元表和元方法)

MetaTable和MetaMethod是Lua中的重要的語法,MetaTable主要是用來做一些類似於C++重載操作符式的功能。

比如,我們有兩個分數:

fraction_a = {numerator=2, denominator=3}

fraction_b = {numerator=4, denominator=7}

我們想實現分數間的相加:2/3 + 4/7,我們如果要執行: fraction_a + fraction_b,會報錯的。

所以,我們可以動用MetaTable,如下所示:

fraction_op={}

function fraction_op.__add(f1, f2)

    ret = {}

    ret.numerator = f1.numerator * f2.denominator + f2.numerator * f1.denominator

    ret.denominator = f1.denominator * f2.denominator

    return ret

end

 爲之前定義的兩個table設置MetaTable:(其中的setmetatble是庫函數)

setmetatable(fraction_a, fraction_op)

setmetatable(fraction_b, fraction_op)

於是你就可以這樣幹了:(調用的是fraction_op.__add()函數) 

fraction_s = fraction_a + fraction_b 

至於__add這是MetaMethod,這是Lua內建約定的,其它的還有如下的MetaMethod: 

__add(a, b)                     對應表達式 a + b

__sub(a, b)                     對應表達式 a - b

__mul(a, b)                     對應表達式 a * b

__div(a, b)                     對應表達式 a / b

__mod(a, b)                     對應表達式 a % b

__pow(a, b)                     對應表達式 a ^ b

__unm(a)                        對應表達式 -a

__concat(a, b)                  對應表達式 a .. b

__len(a)                        對應表達式 #a

__eq(a, b)                      對應表達式 a == b

__lt(a, b)                      對應表達式 a < b

__le(a, b)                      對應表達式 a <= b

__index(a, b)                   對應表達式 a.b

__newindex(a, b, c)             對應表達式 a.b = c

__call(a, ...)                  對應表達式 a(...)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章