Lua简明入门实践(从"基"搞起)_(三)Metatables和面向对象
来源:互联网 发布:mac版betterzip注册码 编辑:程序博客网 时间:2024/06/05 21:53
MetaTable和MetaMethod是Lua中的重要的语法,MetaTable主要是用来做一些类似于C++重载操作符式
的功能。比如,我们想实现分数间的相加:2/3 + 4/7,我们如果要执行: fraction_a + fraction_b,会报错的。
所以,我们可以动用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简明入门实践(从"基"搞起)_(三)Metatables和面向对象
- Lua简明入门实践(从"基"搞起)_(一)Lua集成开发环境
- Lua简明入门实践(从"基"搞起)_(二)Lua基础语法
- Lua简明入门实践(从"基"搞起)_(四)Lua标准库与文件
- Lua简明入门实践(从"基"搞起)_(五)Lua常用小算法
- nim和面向对象(三)
- EXT JS入门和面向对象编程
- Java入门-面向对象和面向过程
- 黑马程序员_匿名内部类和面向对象总结
- 面向对象的三大特性和面向对象开发
- JS和面向对象
- 数组和面向对象
- 学习java和面向对象编程(1)- 入门
- VC++入门经典学习笔记--继承和面向对象
- JAVA和面向对象的简单介绍(入门篇)
- Effective C++笔记: 继承和面向对象设计(三)
- 构造方法和面向对象三大特征
- Python -- 对象和面向对象
- Java中PreparedStatement和Statement的用法区别
- IOCP中在WSASend以及WSARecv的时候出现WSA_IO_PENDING情况的说明
- Android Service简介
- Play Framework介绍2--Hello World 转载自http://www.cnblogs.com/Chaos/archive/2011/04/16/2018361.html
- java中简单实现MD5加密
- Lua简明入门实践(从"基"搞起)_(三)Metatables和面向对象
- 关于nodejs express安装不成功的问题
- encrypt apk
- Single Round Math
- ZOJ 2112 Dynamic Rankings
- 九度 题目1027:欧拉回路
- 数据结构实验之栈:行编辑器
- 使用ZXing扫描条形码和二维码
- 一个好用的vim+go开发环境