迭代器
pairs 和 ipairs区别
pairs: 迭代 table,可以遍历表中所有的 key 可以返回 nil
ipairs: 迭代数组,不能返回 nil,如果遇到 nil 则退出
代码示例:
local tab= {
[1] = "a",
[3] = "b",
[4] = "c"
}
for i,v in pairs(tab) do -- 输出 "a" ,"b", "c" ,
print( tab[i] )
end
for i,v in ipairs(tab) do -- 输出 "a" ,k=2时断开
print( tab[i] )
end
可以自己写迭代器
function square(i,n)
if i
then
i = i+1
return i, i*i
end
end
没有return时,即为nil,则退出for
那么我们就可以调用
for i,v in square(0,3)
去得到
1:1
2:4
3:9了
协同程序:
独立的堆栈,独立的局部变量,独立的指令指针
共享全局变量
任意时刻只能有一个协程在运行
协程A = coroutine.create( 函数F )
创建一个协程A,具体执行内容是函数F
但此时并不会运行该协程,需要resume配合
coroutine.resume(协程, 传入参数) 、
启动某协程
返回值是 是否成功返回状态 + yield的参数或者function的return
coroutine.yield(参数X)
挂起某协程, 其参数X是这一次resume的返回值
而yield的返回值,是下一次resume所传入的参数(resume第一次传入的参数是给function,后面每一次的参数都是yield的返回值)
function的reuturn X是最后一个resume返回的参数
coroutine.status()
查看某协程的状态
3种状态: 死亡dead,挂起suspend,运行running
协程CW = coroutine.wrap(函数F)
创建协程CW, 调用该协程的方式是C(参数),而非resume
对于用wrap创建的协程,不可以用resume和status等查看
coroutine.running()
返回当前正在运行的协程
面向对象
Share = {high = 0, wid = 0}
这样则定义了一个类,成员有high和wid
同时为了能使用Share.high这样去调用成员,我们需要用到元表的__index
并且结合new
构造函数new(对象,参数)
function Share:new(o, high,wid)
o = o or {}
setmetatable(o,self) --元表即自己
self.wid = wid or 0
self.high = high or 0
self.area = wid*high --可计算的成员
return o
end
然后调用 s = Share:new(nil,10,20)即可新建一个对象
成员函数
function Share:printArea()
print("S is ", self.area)
end
调用s:printArea()即可执行
派生类:
Rectangle = Shape:new()
//派生类都要重定义构造函数
function Rectangle:new(o,high,wid)
o = o or Shape:new(o)
setmetable(o,self)
self.area = wid*high
return o
end
另外可以直接重写父类函数
function Rectangle:printArea()