欢迎加入Cocos2d-x 交流群:193411763
源码下载地址: http://download.csdn.net/detail/u012945598/6692125 .lua文件在Resouces文件夹下,名为test.lua
Lua是一门面向过程的语言,并没有面向对象语言中的"类"的概念,但是我们可以通过Lua中的”Metatable(元表)“来模拟一个”类“,关键在于__index这个域,他提供了表的索引入口。
元表也是一个表,Lua语言中定义了很多重定义 table类型操作的入口,他们都是以双下划线”__“开头的,例如__index,__add,当你为一个值设定了Metatable,并且重写了其操作入口,在这个值执行这个操作的时候就会触发重写的自定义操作。具体的说, Lua中每种类型的值都有都有他的默认操作方式, 如, 数字可以做加减乘除等操作, 字符串可以做连接操作, 函数可以做调用操作, 表可以做表项的取值赋值操作. 他们都遵循这些操作的默认逻辑执行, 而这些操作可以通过Metatable来改变.
Metatable中定义的操作add, sub, mul, div, mod, pow, unm, concat, len, eq, lt, le, tostring, gc, index, newindex, call...
__index是什么?举个例子来说,当我们访问一个表中的元素不存在时,则会触发去寻找__index元方法。例如我们要索引一个值如table[key],Lua会首先在table本身中查找key的值,如果没有并且这个table存在一个带有__index属性的metatable,则Lua会按照_index所定义的函数逻辑查找。
下面我们来做一个Demo,创建一个基于Lua的工程,新建一个.lua文本,在文本中写入如下代码:
在上述代码中,我们相当于是定义了一个”类“table,为table定义了一个构造体(注意构造体中的self已经被初始化。正常情况下,谁调用new,self就代表谁),当我们创建对象的时候便可以通过table:new(x,y)方法创建,现在table中共有四个属性,我们再为table类添加两个方法:
下面我们创建两个对象:
我们利用table的构造方法创建了两个变量,通过对象来测试是否能够访问到table中的属性和方法,打印结果如下:
两个对象之间互不影响,都成功访问了类中的属性和方法。
还有一点需要注意的就是,在Lua中的约定,调用方法的的时候使用”: “,访问属性的时候使用". "
self表示一项操作所作用的“接受者”
定义一个函数:
function table:test() 等价于 function Class.test(self)
创建一个对象:
object=table:new(10,20) 等价于 object=table.new(self,10,20)
调用一个函数:
object:test() 等价于 object.test(object)
下图为Xcode中 .lua文件的的完整截图: