lua语法《一》

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.继承的案例代码:
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)几个典型的协议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 























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值