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()
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()
相关文章推荐
- 项目后期Lua接入笔记08--Lua面向对象及LuaBehaviour的再设计
- Lua学习笔记(五):面向对象的实现
- Lua笔记17 面向对象类
- 面向对象与C++程序设计-向量和迭代器学习笔记
- 14.lua学习笔记:面向对象
- Python笔记(4):面向对象,迭代器,生产器
- 笔记: Lua基础: Table, Array, Namespace, Lua的面向对象
- cocos2dx游戏开发学习笔记3-lua面向对象分析
- Lua笔记19 面向对象实现__index
- Java学习笔记8(面向对象一:概念、private)
- js面向对象学习笔记之五(定时器)
- 黑马程序员笔记——Java面向对象之多态
- 【北京圣思园学习笔记】第09讲:面向对象之封装(Encapsulation)
- 黑马程序员笔记——Java面向对象之异常和包
- lua中的面向对象模拟,类,继承,多态
- Java面向对象笔记(五分钟秒懂)
- Java学习笔记13(面向对象六:super)
- OOP面向对象学习笔记(3)---接口与抽象类
- SeaJS结合javascript面向对象使用笔记(一)
- 面向对象学习笔记