Lua 元表和元方法

元表

元表 : 类似于操作方式,里面包含了一系列的解决方案,那么这一系列的解决方案就是元方法。

__index

当这个表索引失败的时候处理情况的例如:

father = 
    {  
        house=1  
    }  
    son = 
    {  
         car=1  
    }  
    setmetatable(son, father) --把son的metatable设置为father  
    print(son.house)  --nil

此时我们并没有给具体的解决方案
再看

 father = {  
    house=1  
    }  
    father.__index = father -- 把father的__index方法指向自己  
    son = {  
    car=1  
    }  
    son的元表设置为father
    setmetatable(son, father)
    print(son.house) 

结果是符合预期为 -1- 原因是给定了具体的解决方案 :__index
解析:首先在son 中没有找到house,发现son的元表是father于是到father中查找__index方法(注意是查找__index ,并不是father本身),而__index指定的表是father于是就查找father表于是找到了。

  • 总结(Lua 查找表元素时的规则)
    • 在表中查找,如果找到返回,没有则继续
    • 判断该表是否有元表,没有元表,返回nil,否则继续
    • 判断元表中(操作指南)是否有没有索引失败的指南(__index) 没有,返回nil,有如果__index是一个表 那么重复1 2 3,如果是一个方法直接返回该函数的值

__call

元方法__call 允许将表当函数使用。
使用方式 __call = function(目标表,参数1,参数2,…)
具体事例:

    local test = {}

    setmetatable(test, {__call = function(test, a,b )
        return a + b
    end})

    print('=====>>>',test(1,2))  -->>  3

这样我们可以将表当方法使用,另外如果需要将数据记录在该表里面可进行如下操作:

    local test = {}

    setmetatable(test, {__call = function(test, a,b,fac)
        test.a = a
        test.b = b
        return (a + b) * fac
    end})

    print('=====>>>',test(1,2,4),test.a,test.b)  -->>  12,1,2

另外,可以应用到类里面进行使用

function Class(base, _ctor)
 local c = {}    -- a new class instance
 ......
 -- expose a constructor which can be called by <classname>(<args>)
 local mt = {}
 ......
 mt.__call = function(class_tbl, ...)
            local obj = {}
            setmetatable(obj,c)
            if c._ctor then
                c._ctor(obj,...)
            end
            return obj
        end  
end

给出一部分,外部使用的时候:

conditionNode = class(baseNode,function(){})
local con = conditionNode() --创建对象
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
 本套课程分为基础与中级两部分,分别就lua语言的各方面知识点进行探讨,学习完本套课程,对于后续Xlua(Tolua等框架)技术的学习提供强大的语言技术保证。       本套lua课程采用入门与商业级两种开发IDE进行教学:入门级的SciTE内置IDE与商业级的IDEA lua插件。本套课程学习完毕,对于除了传统手游外,在VR、AR、商业级大型应用程序、嵌入式设备开发等领域都有较强的指导作用。           《lua中级篇》分为:“函数的进阶”、“字符串进阶”、“Table进阶”、“元表”、“OOP面向对象”、“协同程序”、“IO操作”、“调试与运行”等八个大的章节,详细深入讲解lua开发的方方面面。        内容包含lua可变参数、闭包、模块、函数尾调用、字符串模式匹配、字符串不变性原理、矩阵、链表、元表详解与应用、协同的生命周期与生产消费者问题、lua文件各种读写操作、lua执行外部代码与错误异常处理垃圾收集机制等。       最后,lua中级篇的学习,对于广大学员开发商业级lua热更新技术,具有不可替代的重要作用! 热更新系列(技术含量:中高级):B:《热更新框架设计之Xlua基础视频课程》https://edu.csdn.net/course/detail/27110C:《热更新框架设计之热更流程与热补丁技术》https://edu.csdn.net/course/detail/27118D:《热更新框架设计之客户端热更框架(上)》https://edu.csdn.net/course/detail/27132E:《热更新框架设计之客户端热更框架(中)》https://edu.csdn.net/course/detail/27135F:《热更新框架设计之客户端热更框架(下)》https://edu.csdn.net/course/detail/27136 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值