您的位置:首页 > 编程语言 > Lua

Lua笔记——迭代器、协程、面向对象

2018-03-04 20:05 246 查看
迭代器

pairs 和 ipairs区别pairs: 迭代 table,可以遍历表中所有的 key 可以返回 nilipairs: 迭代数组,不能返回 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<n    then            i = i+1            return i, i*i    endend
没有return时,即为nil,则退出for
那么我们就可以调用for i,v in square(0,3) 去得到1:12:43: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
4000
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 oend
另外可以直接重写父类函数function Rectangle:printArea()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: