012-热更新之lua语言五

2 __newindex元方法

__newindex元方法用来对表更新,__index则用来对表访问。当你给表的一个缺少的索引赋值,解释器会查找__newindex元方法:如果存在则调用这个函数而不进行赋值操作。

我们现在对上面的图片进行一下分析,这个我们就可以很方便的知道__newindex是什么作用了。我们首先将mymetatable设置为mytable的元表,第一个print()输出的已经存在的值,根据__newindex的定义,如果普通表是存在的话就不会调用元表,所以输出的是value1。第二个print()因为mytable和mymetatable已经关联了元表,又因为newkey1是一个不存在的索引,所以对新索引newkkey1不会进行赋值,而会调用元方法,所以就输出nil;钱买你说过了,这个是更新用的,在newkey现在还是一个新的索引的话,__newindex就会对他进行更新,所以mymetatable.newkey就会有值。第三个print(),因为key1本来就是一个存在的值,就不会调用元方法,所以元方法的索引就是nil。只要是不存在的索引的话,都会调用元方法。

3为表添加操作符

如图是连个表相加mytable+secondtable,进行这样的操作就会调用原方法,因为普通表已经无法提供方法了,只能考元方法了;然后系统调用这个__add,在进行__add后面的操作后,__add会将数据会在一起然会返回,这就是__add就功能了。向这个的还有很多,不过他们的基本功能是一样的。

4__call元方法 

__call元方法在lua调用一个值时调用。

5__tostring元方法

一看到这个方法就知道这个一定与字符串有关,接下来我们就以一个例子来说明:

总结一下元表的功能就是将表的功能进行扩充。

 

接下来我们开始新的一章  Lua协同程序(coroutine)

什么是协同(coroutine)?lua协同程序与线程比较类似:拥有独立的堆栈,独立的局部变量,独立的指令指针,同样又与其他协同程序共享全局变量和其他大部分东西。协同是非常强大的功能,但是用起来也很复杂。线程和协同程序的主要区别在于,一个具有多个线程的程序可以同时运行几个线程,而协同程序却需要彼此协作的运行。在任一指定时刻只有一个协同程序在运行,并且这个正在运行的协同程序只有在明确的被要求挂起的时候才会会挂起。协同程序有点类似同步的多线程,在等待同一个线程锁的几个线程有点类似协同。前面罗里吧嗦一大堆话,我也是实在不懂到底协同是什么东西,在对于这种很难搞的新知识,我们采取泥菩萨过河的方式,边走边看。

1基本语法

1.1coroutine.create()创建coroutine,返回coroutine,参数是一个函数,当和resume配合使用的时候就会唤起函数调用

1.2coroutine.resume()重启coroutine,和create配合使用

1.3coroutine.status()查看coroutine的状态 注:coroutine的状态有三种:dead,suppend,running

1.4coroutine.wrap()创建coroutine,和create功能重复

1.5coroutine.yield()挂起coroutine,将coroutine设置为挂起状态,这个和resume配合只用能有很多的效果

1.6coroutine.running() 返回正在跑的coroutine,一个coroutine就是一个线程,当使用runnnig的时候,就是返回一个coroutine的线程号

 

posted @ 2018-10-18 10:34  jake_caiee  阅读(128)  评论(0编辑  收藏  举报