1.元表与元数据
(1)元表本质上是一个普通 Lua 表,元表中的键用来指定操作,称为“事件名”;元表中键所关联的值称为“元方法”,定义操作的行为。
(2)可以方便的定义一个表作为另一个表的元表:
mytable = {}
mymetatable = {}
setmetatable(mytable,mymetatable)
(3)元表中定义了超出lua表常的操作,比如数据越界,两个表相互操作等。
(4)元表中的几个方法
a:__index 元方法:__index元方法是用于处理调用table中不存在的字段进行处理。
1.在表中查找,如果找到,返回该元素,找不到则继续
2.判断该表是否有元表,如果没有元表,返回nil,有元表则继续。
3.判断元表有没有__index方法,如果__index方法为nil,则返回nil;如果__index方法是一个表,则重复1、2、3;如果 __index方法是一个函数,则返回该函数的返回值。
4.如果元表中的index是定义一个表的话,那么元表和当前表之间就有了继承关系,可以通过这种方式实现继承。
5.继承的案例代码:
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中某个不存在的字段赋值,且在赋值时做监管。
1.当对table中不存在的索引赋值时,解释器就会查找__newindex元方法。如果有这个元方法,就调用这个元方法,而不是 执行复制。
如果这个元方法是一个table,解释器就在table中进行复制,而不是对原来的table。
2.rawset/rawget:对“原始的”表进行直接的赋值/取值操作,当对表进行赋值或取值操作时,忽视__index,__newindex 方法。
格式:rawset(table, key, value)和rawget(table, key)。
2.Lua Coroutine详解
(1)线程与协同程序的主要区别在于,一个具有多线程的程序可以同时运行几个线程,而协同程序却需要彼此协作地运行,就 是说,一个具有多个协同程序的程序在任何时刻只能运行一个协同程序,并且正在运行的协同程序只会在其显示地挂起时,
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
(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.继承的案例代码:
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中某个不存在的字段赋值,且在赋值时做监管。
1.当对table中不存在的索引赋值时,解释器就会查找__newindex元方法。如果有这个元方法,就调用这个元方法,而不是 执行复制。
如果这个元方法是一个table,解释器就在table中进行复制,而不是对原来的table。
2.rawset/rawget:对“原始的”表进行直接的赋值/取值操作,当对表进行赋值或取值操作时,忽视__index,__newindex 方法。
格式:rawset(table, key, value)和rawget(table, key)。
2.Lua Coroutine详解
(1)线程与协同程序的主要区别在于,一个具有多线程的程序可以同时运行几个线程,而协同程序却需要彼此协作地运行,就 是说,一个具有多个协同程序的程序在任何时刻只能运行一个协同程序,并且正在运行的协同程序只会在其显示地挂起时,
它的执行才会暂停。
(2)几个典型的协议APIa: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