Lua学习笔记五——metatable

metatable是元表的意思,在python中,有meta class,即元类,不管是元表还是元类,都是功能强大的,简单的来说,元类就是类的类,元表就是table的table。

下面看看元表的强大,利用table模拟list的加法操作:

 

定义列表table

list = {} list.mt = {}   

其中list.mt是用来准备定义list的元表的

 

定义初始化函数

function list.new(ls) local l_ls = {} setmetatable(l_ls, list.mt) for i, v in ipairs(ls) do l_ls[i] = v end return l_ls end

其中setmetatable(l_ls, list.mt)是设置list的元表

 

定义list的操作函数 

 function list.add(lhs, rhs) local ret = list.new{} for i, v in ipairs(lhs) do ret[i] = v end for i, v in ipairs(rhs) do ret[table.maxn(ret)+1] = v end return ret end

 

……

 

 

定义list的tostring方法,便于打印出人性化信息

function list.tostring(ls) return "{" .. table.concat(ls, ", ") .. "}" end

 

 

定义list操作,相当于C++中的运算符重载

list.mt.__add = list.add 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"} ls2 = list.new{"9", "2009"} ls3 = ls1 + ls2 print(ls3) for i, v in ipairs(ls3) do print(i, v) end

 

 元表是强大的,因为在你用它之前,它已经被设定过了……

你可能感兴趣的:(Lua,lua,function,table,list,python,class)