metatable是元表的意思,在python中,有meta class,即元類,不管是元表還是元類,都是功能強大的,簡單的來說,元類就是類的類,元表就是table的table。
下面看看元表的強大,利用table類比list的加法操作:
定義列表table
list = {}<br />list.mt = {}<br />
其中list.mt是用來準備定義list的元表的
定義初始化函數
function list.new(ls)<br />local l_ls = {}<br />setmetatable(l_ls, list.mt)<br />for i, v in ipairs(ls) do<br />l_ls[i] = v<br />end<br />return l_ls<br />end
其中setmetatable(l_ls, list.mt)是設定list的元表
定義list的操作函數
function list.add(lhs, rhs)<br />local ret = list.new{}<br />for i, v in ipairs(lhs) do<br />ret[i] = v<br />end<br />for i, v in ipairs(rhs) do<br />ret[table.maxn(ret)+1] = v<br />end<br />return ret<br />end
……
定義list的tostring方法,便於列印出人性化資訊
function list.tostring(ls)<br />return "{" .. table.concat(ls, ", ") .. "}"<br />end
定義list操作,相當於C++中的運算子多載
list.mt.__add = list.add<br />list.mt.__tostring = list.tostring
其中__add,做加法運算,__tostring會被print函數調用。另外還有:
__sub 減法 -
__mul 乘法 *
__div 除法 /
__unm 相反數 -
__mod 模數 %
__pow 乘冪 ^
__concat 串連操作 ..
__len 長度操作 #
__eq 相等 ==
__lt 小於 <
__le 小於等於 <=
不等於、大於、大於等於會用 ==, < , <=轉換
__index 訪問操作 table[key]
__newindex 賦值操作 table[key] = value
__call 叫用作業 a = function xx() -- end a()
調用樣本
ls1 = list.new{"a", "b", "c"}<br />ls2 = list.new{"9", "2009"}</p><p>ls3 = ls1 + ls2<br />print(ls3)<br />for i, v in ipairs(ls3) do<br />print(i, v)<br />end
元表是強大的,因為在你用它之前,它已經被設定過了……