lua面向对象模拟简介
2014-11-04 16:40
344 查看
lua不是面向对象语言,但可以通过表(table)和元表(metatable)来模拟。table 是 lua 中唯一的一种数据结构,它可以用来描述原始的数组、符号表、集合、 记录、图、树等。每一个tabel都可以附加元表, 元表是带有索引集合的表,它可以改变被附加表的行为。因此,lua可以利用元表来模拟面向对象的行为。首先需要了解下面四个东东:
__index,__newindex,rawget和rawset。
__index:是metatable的一个索引,它的值可以是表或者函数,它的作用是什么呢?举一个栗子:
打印结果是10,它的查找过程是:首先在表A中查找x,没有找到,继续查找A的元表B,找到元表B的索引__index,此时__index的值是表B,表B是有元素x的,所以打印x的值10。简单总结一下查找表元素的过程:
1. 在表中查找,如果找到,返回该元素,找不到则继续2。
2. 判断该表是否有元表,如果没有元表,返回nil,有元表则继续3 。
3. 判断元表有没有__index,如果__index方法为nil,则返回nil;如果__index的值是一个table,则重复1、2、3;如果__index的值是一个function,则返回该函数的返回值。
__newindex:是metatable的一个索引,跟__index类似,它的值也可以是table或者function,当你给一个不存在的key赋值时,lua会在metatable里查找__newindex。看下面的例子:
第一个print语句,打印是nil,第二个print语句打印出20。__newindex的值在这里是一个函数,有三个参数分别表示:表,键和值。
rawset:可以让你给表的索引赋值时绕过__newindex,如果你在上面的B.__newindex中直接使用t.k = v,会循环调用__newindex产生 stack overflow,rawset可以避免死循环。
rawget:可以绕过__index,如:
print(rawget(A, A.x));
此时打印nil,不会调用元表B的__index。
下面的demo使用lua简单模拟了面向对象的操作。
运行结果:
eat: animal
no premission
eat: bage
name=bage; flySpeed=20
本文出自:http://codingnow.cn/language/1542.html
__index,__newindex,rawget和rawset。
__index:是metatable的一个索引,它的值可以是表或者函数,它的作用是什么呢?举一个栗子:
1. 在表中查找,如果找到,返回该元素,找不到则继续2。
2. 判断该表是否有元表,如果没有元表,返回nil,有元表则继续3 。
3. 判断元表有没有__index,如果__index方法为nil,则返回nil;如果__index的值是一个table,则重复1、2、3;如果__index的值是一个function,则返回该函数的返回值。
__newindex:是metatable的一个索引,跟__index类似,它的值也可以是table或者function,当你给一个不存在的key赋值时,lua会在metatable里查找__newindex。看下面的例子:
rawset:可以让你给表的索引赋值时绕过__newindex,如果你在上面的B.__newindex中直接使用t.k = v,会循环调用__newindex产生 stack overflow,rawset可以避免死循环。
rawget:可以绕过__index,如:
print(rawget(A, A.x));
此时打印nil,不会调用元表B的__index。
下面的demo使用lua简单模拟了面向对象的操作。
eat: animal
no premission
eat: bage
name=bage; flySpeed=20
本文出自:http://codingnow.cn/language/1542.html
相关文章推荐
- lua中的面向对象模拟,类,继承,多态
- lua中的面向对象模拟,类,继承,多态
- lua中的面向对象模拟,类,继承,多态
- lua中的面向对象模拟,类,继承,多态
- lua中的面向对象模拟,类,继承,多态
- lua中的面向对象模拟,类,继承,多态
- lua中的面向对象模拟,类,继承,多态
- 面向对象,模拟系统登录
- Lua 面向对象实现
- javascript面向对象基础——作用域、闭包、模拟私有属性
- 转载和积累系列 - Lua 有趣的面向对象实现
- 面向对象开发过程简介
- Lua面向对象设计中添加super
- lua面向对象详解(1)
- LUA面向对象浅析
- lua面向对象详解(3)
- 二叉查找数C++ 数组模拟二叉树及面向对象实现
- 面向对象设计的六大原则简介
- PHP面向对象之旅:接口与组合模拟多继承
- PHP:面向对象学习笔记,重点模拟Mixin(掺入)