Lua學習筆記五——metatable

來源:互聯網
上載者:User

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

 

 元表是強大的,因為在你用它之前,它已經被設定過了……

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.