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就好似树的影子,他们是分主次关系的。
看大神的说法是:”树“叫作本表,”树“的影子叫作虚表。感受更准确哦~
继续干活了。。。还想继续深层探讨,可是。。。下次遇到再学习~