Lua协程
Lua 协同程序(coroutine)与线程比较类似:拥有独立的堆栈,独立的局部变量,独立的指令指针,同时又与其它协同程序共享全局变量和其它大部分东西。
协同程序可以理解为一种特殊的 线程,可以暂停和恢复其执行,从而允许非抢占式的多任务处理。
函数
功能
coroutine.create(func)
创建一个协程,并传入一个函数(function),返回的是创建的协程,创建后的协程会进入挂起状态。
coroutine.resume(co[,…])
启动协程,传入要启动的协程和协程函数需要的参数(当不是第一次启动时,参数是作为上次挂起的返回值),返回的是是否正常启动协程(boolean)和被挂起时yield传来的参数或是函数的返回值。
coroutine.yield(…)
挂起正在运行的协程,传入的参数会作为上一次resume启动的返回值,而yield挂起的返回值是下一次resume启动传入的参数。
coroutine.status(co)
查看协程当前状态,suspended–挂起,running–运行中,dead–结束
coroutine.warp(f ...
Lua元表
设置元表:setmetatable(表,元表)
原表内置特殊属性:
属性
作用
__index
索引,在表内找不到时到__index设置的表找,或执行__index的函数
__newindex
增加新键时,执行设置的函数或者添加到newindex设置的表
__call(…)
当表被当作函数调用时执行call设置的函数,可以传参
__tostring
当表被当作字符串运算或输出时,执行tostring设置的函数
__add(self,other)
对应的运算符 +
__sub(self,other)
对应的运算符 -
__mul(self,other)
对应的运算符 *
__div(self,other)
对应的运算符 /
__mod(self,other)
对应的运算符 %
__unm(self)
对应的运算符 -(负号)
__concat(self,other)
对应的运算符 ..
__eq(self,other)
对应的运算符 ==
__lt(self,other)
对应的运算符 <
...
Lua字符串
声明方式单引号
1local str = 'abcd'
双引号
1local str = "abcd"
方括号(可换行)
12345local str = [[1,2,3]]
长度计算string.len() ASCII 字符串的长度。
12str = "你好"print(string.len(str)) --输出 6
utf8.len()
1print(utf8.len(str)) --输出2
字符串操作
序号
方法 & 用途
1
string.upper(argument): 字符串全部转为大写字母。
2
string.lower(argument): 字符串全部转为小写字母。
3
**string.gsub(mainString,findString,replaceString,num)**在字符串中替换。mainString 为要操作的字符串, findString 为被替换的字符,replaceString 要替换的字符,num 替换次数(可以忽略,则全部替换),如:& ...
Lua函数
声明方式变量式
123local f = function() print("hello")end
函数式
123function func() print("hello")end
多返回值Lua函数可以返回多个结果值
12345function mulreturn () return 1, 2endprint(mulreturn())-- 输出 1,2
可变参数在函数参数列表中使用三点 … 表示函数有可变的参数。
12345678function add(...) local s = 0 for i, v in ipairs{...} do --> {...} 表示一个由所有变长参数构成的数组 s = s + v end return s end print(add(3,4,5,6,7)) --->输出25
select
select(“#”,…) 来获取可变参数的数量
123456f ...
Lua面向对象
12345678910111213141516171819Object = {}-- 构造方法function Object:new() local o = {} self.__index = self setmetatable(o,self) return oend-- 继承function Object:SubClass(className) _G[className] = {} self.__index = self _G[className].base = self -- 实现重写调用父类的方法 setmetatable(_G[className],self)end
重写并调用父类方法1234567891011121314function Object:Hello() print("obj hello")endObject:SubClass("Cat")local c = Cat:new()function Cat:He ...
Lua数据类型
数据类型
描述
nil
这个最简单,只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)。
boolean
包含两个值:false和true。false 和 nil 看作是 false,其他的都为 true,数字 0 也是 true
number
表示 double 双精度类型的实浮点数
string
字符串由一对双引号或单引号来表示
function
由 C 或 Lua 编写的函数
userdata
表示任意存储在变量中的C数据结构
thread
表示执行的独立线路,用于执行协同程序
table
Lua 中的表(table)其实是一个”关联数组”(associative arrays),数组的索引可以是数字、字符串或表类型。在 Lua 里,table 的创建是通过”构造表达式”来完成,最简单构造表达式是{},用来创建一个空表。
type(args)计算args的类型并返回(返回为string)
table可以使用table.unpack()函数,将数组形式的table拆开。
这个函数有三个参数
第一个参数就是要拆的ta ...
Lua基本语法
变量变量的默认值均为 nil。
Lua 变量有三种类型:
全局变量
局部变量
表中的域。
Lua 中的变量全是 全局变量
用 local 显式声明为 局部变量。
局部变量的作用域为:从声明位置开始到所在语句块结束。
1234567a = 5 -- 全局变量local b = 5 -- 脚本局部变量function joke() c = 5 -- 全局变量 local d = 6 -- 函数局部变量end
循环while循环
1234while(condition)do statementsend
for循环
数值for循环
123for var=exp1,exp2,exp3 do <执行体> end
泛型for循环
12345a = {"one", "two", "three"}for i, v in ipairs(a) do print(i, v)end
...