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基础语法。
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中的表的概念及其相关操作方法
- Lua编程示例(二):面向对象、metatable对表进行扩展
- 把Lua编译进nginx步骤方法
- Lua脚本自动生成APK包
- Lua中的元表(metatable)、元方法(metamethod)详解
- Lua中的metatable介绍
- Lua中ipair和pair的区别
- Lua中的函数精讲笔记
- 浅谈Lua的面向对象特性
- 详解Lua中的变量相关知识点
- Lua脚本语言入门笔记
- Lua脚本调用外部脚本
- 详解Lua中的if语句的使用方法
- Lua中调用函数使用点号和冒号的区别
- Lua中的闭合函数、非全局函数与函数的尾调用详解
- Lua中强大的元方法__index详解
- Lua中调用C++函数示例
- Lua面向对象之类和继承浅析
- Lua性能优化技巧(一):前言
- Lua中获取table长度问题探讨