Lua简明入门实践(从"基"搞起)_(三)Metatables和面向对象

来源:互联网 发布:mac版betterzip注册码 编辑:程序博客网 时间:2024/06/05 21:53
(三)Metatables和面向对象
接上一篇(二)Lua基础语法。

8、MetaTable和MetaMethod

       MetaTable和MetaMethod是Lua中的重要的语法,MetaTable主要是用来做一些类似于C++重载操作符式

的功能。比如,我们想实现分数间的相加:2/3 + 4/7,我们如果要执行: fraction_a + fraction_b,会报错的。

  * setmetatable(table, meta_table)      设置元表
  * getmetatable(table)                       获取元表 

       所以,我们可以动用MetaTable,于是可以这么做:


       至于__add这是MetaMethod,这是Lua内建约定的,其它的还有如下的MetaMethod:


       表相关:


       访问索引,如果执行读取一个表中的操作,而这个表里又没有这个域,那么Lua就去查询metatable中的__index域。如果__index是表, 那么就去查__index表中有没有这个域,如果有就从__index这个表里的这个域里去取值。如果__index是函数,那么就调用 __index(tb, key)函数。


        更新索引,在更改表域的时候,如果这个表中没有这个域,那么就会从元表的__index里去找。与__index同理。

这两个东西,在类继承里用到。


9、面向对象

        上面我们看到有__index这个重载,这个东西主要是重载了find key的操作。这操作可以让Lua变得有点面向对象的感觉,让其有点像Javascript的prototype。

  所谓__index,说得明确一点,如果我们有两个对象a和b,我们想让b作为a的prototype只需要:


       例如下面的示例:你可以用一个Window_Prototype的模板加上__index的MetaMethod来创建另一个实例:

          于是:MyWin中就可以访问x, y, width, height的内容了。(注:当表要索引一个值时如table[key],Lua会首先在table本身中查找key的值, 如果没有并且这个table存在一个带有__index属性的Metatable, 则Lua会按照__index所定义的函数逻辑查找)

  有了以上的基础,我们可以来说说所谓的Lua的面向对象。


      上面我们可以看到有一个new方法和一个toString的方法。其中:

     * 1)self 就是 Person,Person:new(p),相当于Person.new(self, p)

     * 2)new方法的self.__index = self 的意图是怕self被扩展后改写,所以,让其保持原样
     * 3)setmetatable这个函数返回的是第一个参数的值。

  于是:我们可以这样调用:


          继承如下,Lua和Javascript很相似,都是在Prototype的实例上改过来改过去的。



      



0 0
原创粉丝点击