1.元表与元数据

(1)元表本质上是一个普通 Lua 表,元表中的键用来指定操作,称为“事件名”;元表中键所关联的值称为“元方法”,定义操作的行为。
(2)可以方便的定义一个表作为另一个表的元表:

mytable = {} 
 mymetatable = {} 
 setmetatable(mytable,mymetatable)

(3)元表中定义了超出lua表常的操作,比如数据越界,两个表相互操作等。
(4)元表中的几个方法
a:__index 元方法:__index元方法是用于处理调用table中不存在的字段进行处理。

当你通过键来访问 table 的时候,如果这个键没有值,那么Lua就会寻找该table的metatable(假定有metatable)中的           __index 键。如果__index包含一个表格,Lua会在表格中查找相应的键;如果__index包含一个函数的话,Lua就会调用那个           函数,table和键会作为参数传递给函数。

lua表中查找元素的步骤:

1.在表中查找,如果找到,返回该元素,找不到则继续

2.判断该表是否有元表,如果没有元表,返回nil,有元表则继续。

3.判断元表有没有__index方法,如果__index方法为nil,则返回nil;如果__index方法是一个表,则重复1、2、3;如果                __index方法是一个函数,则返回该函数的返回值。

4.如果元表中的index是定义一个表的话,那么元表和当前表之间就有了继承关系,可以通过这种方式实现继承。

5.继承的案例代码:

1.当对table中不存在的索引赋值时,解释器就会查找__newindex元方法。如果有这个元方法,就调用这个元方法,而不是执行复制。

local smartMan = { 
 name = "none", 
 age = 25, 
 money = 9000000,    
 sayHello = function() 
 print("大家好,我是聪明的豪。"); 
 end 
 } 
 local t1 = {}; 
 local t2 = {}
 local mt = {__index = smartMan} 
 setmetatable(t1, mt); 
 setmetatable(t2, mt); 
 print(t1.money);//在调用t1 money时,会到元表smartMan中取值,此时smartMan相当于是基类。 
 t2.sayHello(); 
 b:__newindex 元方法:要对table中某个不存在的字段赋值,且在赋值时做监管。

 如果这个元方法是一个table,解释器就在table中进行复制,而不是对原来的table。

2.rawset/rawget:对“原始的”表进行直接的赋值/取值操作,当对表进行赋值或取值操作时,忽视__index,__newindex              方法。

 格式:rawset(table, key, value)和rawget(table, key)。

2.Lua Coroutine详解

(1)线程与协同程序的主要区别在于,一个具有多线程的程序可以同时运行几个线程,而协同程序却需要彼此协作地运行,就       是说,一个具有多个协同程序的程序在任何时刻只能运行一个协同程序,并且正在运行的协同程序只会在其显示地挂起时,

    它的执行才会暂停。  

(2)几个典型的协议API

a:coroutine.create():创建coroutine,返回coroutine, 参数是一个函数,当和resume配合使用的时候就唤醒函数调用 
 b:coroutine.resume():重启coroutine,和create配合使用,会启动create的协程。 
 c:coroutine.yield():挂起coroutine,将coroutine设置为挂起状态,这个和resume配合使用能有很多有用的效果 
 d:coroutine.status():查看coroutine的状态.注:coroutine的状态有四种:dead,suspend,running,normal 
 e:coroutine.wrap():创建coroutine,返回一个函数,一旦你调用这个函数,就进入coroutine,和create功能重复 
 f:coroutine.running():返回正在跑的coroutine,一个coroutine就是一个线程,当使用running的时候,就是返回一个corouting的线程号

demo1:

coroutineFunc = function (a, b)  
    for i = 1, 10 do 
        print(i, a, b) 
        coroutine.yield() 
    end 
end 
co2 = coroutine.create(coroutineFunc)        --创建协同程序co2 
coroutine.resume(co2, 100, 200)                -- 1 100 200 开启协同,传入参数用于初始化 
coroutine.resume(co2)                        -- 2 100 200   程序被挂起后,循环的状态还是有效的,这里输出的是2 
coroutine.resume(co2, 500, 600)                -- 3 100 200 继续协同,传入参数无效 
co3 = coroutine.create(coroutineFunc)        --创建协同程序co3 
coroutine.resume(co3, 300, 400)                -- 1 300 400 开启协同,传入参数用于初始化 
coroutine.resume(co3)                        -- 2 300 400  
coroutine.resume(co3)                        -- 3 300 400