您的位置:首页 > 编程语言 > Lua

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

2015-08-05 11:29 459 查看
(三)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的实例上改过来改过去的。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  lua