-- ocos2d.x.version: cocos2d-x-3.15.1
-- 语言: Lua
-- 编译: xcode
-- 工具: sublimeText
print("test====")
-- lua的元表到底是什么?元表的元方法到底有什么用?
-- 首先我们看下面的场景
local t = { a = "a" };
local t1 = { b = "b" };
print( t1.b );
print( t1.a );
-- [LUA-print] b
-- [LUA-print] nil -- 很显然 t1里面是没有元素a的,因为只有t里面才有元素a
-- 解决方案1
t1["a"] = t.a;
-- 解决方案2,我们可以写一个for循环 例如:
for k,v in pairs(t) do
if(not t1[k]) then
t1[k] = t[k];
end
end
-- 我们看下面的场景2
local t2 = { a = 10, b = 20 };
local t3 = { a = 100, b = 200 };
-- 我们要实现2个table相加
-- emmm..... 是不是很麻烦
-- 实际还有更多的应用场景等着你 emmm。。。
-- 所以lua提供了元表 和 元方法
-- 解:场景1
local t4 = { a = "a" };
local t5 = { b = "b" };
t4.__index = t4;
setmetatable(t5, t4)
print("t5.a==== " , t5.a);
-- [LUA-print] t5.a==== a -- 原来t5是没有a的 现在拥有t4的a了
-- t5的元表就是t4 寻找.a的时候,自己身上没有,就去__index元方法里面找,如果__index里面没有看看有没有元方法以此内推下去
-- 如果只是设置了元表,没有设置__index是不会找到的,会返回nil值
-- 找到了返回值,没有找到返回nil
-- 解:场景2
local t6 = { a = 10, b = 20 };
local t7 = { a = 100, b = 200 };
local t8 = {};
t8.__add = function(tbl1, tbl2)
local tempTable = {};
for key, value in pairs(tbl2) do
-- 这里我只是随便实现哈,如果要实现2个table值合并,key不同的时候合并
-- 这个写法是不可以的,比如t7多了一个key 是 c = 100 结果是有错误的。
if tbl2[ key ] and tbl1[ key ] then
tempTable[ key ] = tbl2[ key ] + tbl1[ key ];
end
end
return tempTable
end
setmetatable(t6, t8)
local t9 = t6 + t7;
print("t9.a==== " , t9.a);
print("t9.b==== " , t9.b);
-- [LUA-print] t9.a==== 110
-- [LUA-print] t9.b==== 220
-- 其实你们发现没,我们更改__add函数还可以解场景1的问题.
-- 在lua里面可以重新定义元方法的有很多
-- __add(a, b) --加法
-- __sub(a, b) --减法
-- __mul(a, b) --乘法
-- __div(a, b) --除法
-- __mod(a, b) --取模
-- __pow(a, b) --乘幂
-- __unm(a) --相反数
-- __concat(a, b) --连接
-- __len(a) --长度
-- __eq(a, b) --相等
-- __lt(a, b) --小于
-- __le(a, b) --小于等于
-- __index(a, b) --索引查询
-- __newindex(a, b, c) --索引更新
-- __call(a, ...) --执行方法调用
-- __tostring(a) --字符串输出
-- __metatable --保护元表
-- 这些都是可以重新定义元方法的
-- 当然元方法还有很多 __newindex, __call, __tostring等这里就不一一举例了。
-- 由此我们可以大概看出元表和元方法在实际当中的应用,是lua语言为了解决一些实际性的问题而产生的固定的定义方法。
-- 元表我们可以把他看成是一个附加的一个特殊属性,比如B是A的元表,那么A就拥有了B所有的功能。
-- 元方法我们可以把他看着是table的行为,类似于C++一样的操作符重载,我们重载以后可以自定义解决一些实质性的问题。
总结:
虽然我可能说的不太对,还是希望大家多参考参考,发挥更有表达的想象力噢。
大家也可以参考这个点赞很高 lua元表 说的也很清晰。
老规矩,手动码字,真心不易,如有不懂可以联系大嫂,当前有创业或者发财的一定要联系我噢,风里雨里大嫂一直等你,V:1154195328; QQ = V。