metatable是我用Lua語言一段時間都沒有搞的很明白的東西。學習
再次遇到,就決心要和metatable敘敘感情。spa
首先談談元方法metaFunction有哪些:3d
add, sub, mul, div, mod, pow, unm, concat, len, eq, lt, le, tostring, gc, index, newindex, call...blog
使用的時候記得在元方法前面加上2條下劃線:例如:index -> __index繼承
說說__index的使用:原型
local t1 = {}
function t1.showInfo()
print("t1.showInfo Method~")
endstring
local t2 = {}
setmetatable(t2, {__index = t1})
t2.showInfo()io
上面的代碼我建立了2個表t1,t2.table
將{__index = t1}設置爲t2的metatable.function
這個時候調用t2的showInfo方法,能夠看到的結果是:
忽然間,有沒有一種繼承的感受:P
程序的運做大概是這樣的:
程序首先找t2的showInfo方法,結果沒找到,而後看t2有元表存在,
而後根據t2元表中的__index屬性的找到t2的"父類"t1表,而且找到了showInfo方法,故調用之。
再看如何經過__index建立咱們本身的類。看代碼:
local Car = {}
Car.__index = Car
function Car:new( o )
o = o or {}
setmetatable(o, Car)
return o
end
function Car:run()
end
...
...
...
分析上面的代碼是如何建立咱們本身的一個類,首先是建立了Car的table表,而後把Car的table表的__index設置爲本身自己。
而後在假如咱們須要建立一個新的類,local myCar = Car.new()
咱們在Car的new方法中的工做是,須要注意的是:
咱們傳了一個參數o,這個o就是Car的self原型,也就是上面咱們建立的: local Car = {} 這張表,
若是o不存在,就新建一個o的空表,而後將o的metatable設置爲Car,其實上面的代碼,
能夠合併成一個:
setmetatable(o,{__index = Car})
上面的一句話,至關於o表已經繼承了父類Car了,當o類中沒有的方法時,他會去父類Car中找。
因此當咱們調用myCar.run();時,就能夠成功的調用Car的run方法了。
回過頭來,想一想metatable。
做爲一個table,總有他的metatable的,當咱們的table進行相關運算處理時,會尋求metatable的幫助,若是metatable能幫助table
來解決問題,那是最好不過了。
table是一棵樹,那麼metatable就好似樹的影子,他們是分主次關係的。
看大神的說法是:」樹「叫作本表,」樹「的影子叫作虛表。感受更準確哦~
繼續幹活了。。。還想繼續深層探討,可是。。。下次遇到再學習~