lua的元表到底是什么?元表的元方法到底有什么用?

-- 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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值