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

迭代器

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<n
    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()



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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值