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