zoukankan      html  css  js  c++  java
  • 成为Lua高手之metatable

    metatable是我用Lua语言一段时间都没有搞的很明白的东西。

    再次遇到,就决心要和metatable叙叙感情。

    首先谈谈元方法metaFunction有哪些:

    add, sub, mul, div, mod, pow, unm, concat, len, eq, lt, le, tostring, gc, index, newindex, call...

    使用的时候记得在元方法前面加上2条下划线:例如:index  ->   __index

    说说__index的使用:

    local t1 = {}
    function t1.showInfo()
      print("t1.showInfo Method~")
    end

    local t2 = {}
    setmetatable(t2, {__index = t1})
    t2.showInfo()

    上面的代码我创建了2个表t1,t2.

    将{__index = t1}设置为t2的metatable.

    这个时候调用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就好似树的影子,他们是分主次关系的。

    看大神的说法是:”树“叫做本表,”树“的影子叫做虚表。感觉更准确哦~

    继续干活了。。。还想继续深层探讨,但是。。。下次遇到再学习~

  • 相关阅读:
    在项目开始前,为客户做专门的“需求变更流程”培训是必要的
    代码优化四部曲:“拆套”、“解耦”、”封装“、“重构”
    这个博客的目的就是解构程序猿的世界观
    如果3D技术仅仅只是用于游戏和娱乐,那真是太暴殄天物了
    如何用Xcode 4.5开发3.5寸屏幕的iPhone 应用程序?
    所谓开发经验,其实就是对业务流程的积累
    项目经理必备的两大能力
    XML文件总是无法读取其中的数据
    在switch的case语句后,使用UIAlertView报错
    代码编写原则
  • 原文地址:https://www.cnblogs.com/vokie/p/3640550.html
Copyright © 2011-2022 走看看