Lua语法
变量
number(表示所有数字) string boolean nil(与C#中的null类似)
四种复杂的变量类型 fuction(函数) table(表) userdata(数据结构) thread(协同程序)
type函数 得到变量的类型返回值是一个string
a = 1
a = type(a)
print(a)
Lua中可以直接使用没有初始化的变量,默认为nil
Lua中不用指明变量类型 可自动识别
字符串操作
--获取字符串长度
str = "asdbhb你好"
print(#str)
--一个汉字占三个长度 一个字母占一个长度
--字符串多行打印
print("123\n123")
s= [[123
123
123]]
print(s)--字符串拼接print("123".."456")
s1 ="123"
s2 = 111
print(s1..s2)print(string.format("xxxxxx%d"),18)--别的类型转字符串
a = true
b = tostring(a)--公共方法
str = "abdcDSas"
--小写转大写
print(string.upper(str))
--大写转小写
print(string.lower(str))
--翻转字符串
print(string.reverse(str))
--字符串索引查找
print(string.find(str,"dc"))
--截取字符串
print(string.sub(str,3,4))
--字符串重复
print(string.rep(str,2))
--字符串修改
print(string.gsub(str,"dc","xx"))
--字符转ascii码
print(string.byte("Lua",1))
--Ascii码转字符
print(string.char())
运算符
--算术运算符
-- + - * / %
-- 没有自增自减 ++ -- 没有复合运算符 += -=print("加法运算".. 1+2)
print("123.4" + 1)
print("减法运算".. 2-1)
print("123.4" - 1)
print("乘法运算".. 1*2)
print("123.4" * 1)
print("除法运算".. 2/1)
print("123.4" / 1)
print("取余运算".. 2%1)
print("123.4" % 1)
--一个数的几次方
print("幂运算".. 2^1)
print("123.4" ^ 1)--条件运算符
--> < >= <= == ~=
print(3>1)
print(3<1)
print(3>=1)
print(3<=1)
print(3==1)
print(3~=1) --不等于--逻辑运算符
--and or not
print(true and false)
print(true and true)print(true or false)
print(false or false)print( not true)--取反--不支持位运算符 & |
--不支持三目运算符 ? :
条件分支语句
a = 9
--单分支
--if 条件 then....end
if a > 5 thenprint("1111")
end --双分支
--if 条件 then..else..end
if a > 5 thenprint("1111")
elseprint("2222")
end --多分支
--if 条件 then..elseif 条件 then..end
if a > 5 thenprint("1111")
elseif a > 3 thenprint("2222")
elseif a > 2 thenprint("3333")
elseprint("4444")
end --lua中没有switch语法
循环语句
--while语句
num = 0
--while 条件 do .... end
while num < 5 doprint(num)num = num + 1
end--do while语句
num = 0
--repeat ......until 条件(注意:条件是结束条件)
repeatprint(num)num = num + 1
until num > 5 --满足条件跳出 结束条件--for循环
--for 起始值,结束值,增量 do.....end
for i = 1,5 do --i会默认递增print(i)
endfor i = 1,5,2 do --自定义增量,第三个参数为每次递增多少print(i)
endfor i = 5,1,-1 do print(i)
end
函数
--function 函数名()-- body
--end--a = function()
--end--无参数无返回值
function F1()print("F1")
endF1()F2 = function()print("F2")
endF2()--有参数
function F3(a)print("参数"..a)
end
F3(1)
F3("123")
--如果参数的参数和函数不匹配
--不会报错 只会补空或者丢弃
F3()
F3(1,2,3)--有返回值
function F4(a)return a
end
temp = F4("123")
print(temp)function F5(a)return a,"123",true
end
temp,temp2,temp3= F5(1)
print(temp)
print(temp2)
print(temp3)--函数的类型
F6 = function()print(123)
end
print(type(F6))--函数的重载
--Lua中函数不支持重载,默认调用最后一个--变长参数
function F7( ... )--变长参数使用 用一个表存起来arg = {...}for i=1,#arg doprint(arg[i])end
endF7(1,2,3,4,"5",6,true,8)--函数嵌套
function F8()return function()print(123)end
endF9 = F8()
F9()--闭包
function F10(x)--改变传入参数的生命周期return function(y)return x+yend
endF11 = F10(10)
print(F11(9))
复杂数据类型 table
--所有的复杂类型都是table(表)--数组
a = {1,2,3,"4",nil,5}
--Lua中索引从1开始
print(a[1])
--#是通用的获取长度的关键字
--打印长度时nil如果在最后一位会被忽略
print(#a)--数组遍历
for i=1,#a doprint(a[i])
end--二维数组
a = {{1,2,3,4},{5,6,7,8}}
print(a[1][1]) --第一个中括号表示第几个表,第二个表示当前表中第几个元素--二维数组遍历
for i=1,#a dob = a[i]for j=1,#b doprint(b[j])end
end--自定义索引
--计算长度忽略小于0的索引
aa = {[0] = 1, 2 , 3 ,[-1] = 4 ,5}
print(aa[0])
print(aa[-1])
迭代器遍历
a = {[0] = 1,2,3,4,5,6,[-1]=7}--ipairs
--[[ipairs遍历 还是从1开始往后遍历的 小于等于0的值得不到只能找到连续索引的键 如果中间断序也无法遍历出后面的值
]]
for i,k in ipairs(a) doprint(i,k)
end--pairs
--它能够找到所有键
for k,v in pairs(a) doprint(k,v)
endfor i in pairs(a) do--只遍历键print(i)
end
字典
--字典的声明
a = {["name"] = "xiaohei",["age"] = 14,["1"] = 5}
--访问变量 中括号填键来访问
print(a["name"])
print(a["age"])
--还可以类似成员变量的形式得到值
print(a.name)
print(a.age)
--虽然可以通过,成员变量形式得到值,但是不能是数字
print(a["1"])--修改
a["name"] ="laohei"
print(a.name)
--新增
a["sex"] = false
print(a.sex)
--删除
--删除只能通过修改的方式给变量置空
a["1"] = nil--字典的遍历
--如果要模拟字典 遍历一定用pairs
for k,v in pairs(a) doprint(k,v)
endprint("***************")for k in pairs(a) doprint(k,a[k])
end
类和结构体
--Lua中默认没有面向对象
Student = {age = 1,sex = true,Up =function()print(Student.age)print("up")end,learn = function(t)print(t.sex)print("learn")end
}
--Lua中点和冒号的区别
Student.learn(Student)
--冒号会默认把调用者作为第一个参数传入
Student:learn()Student.name = "xiaohei"
Student.Speak = function()print("Speak")
end
function Student:Speak2()--Lua中有一个关键字self表示默认传入的第一个参数print(self.age)print("Speak2")
end
print(Student.age)
Student.Up()
Student:Speak2()
表的公共操作
--table提供的一些公共方法
t1 = {{age = 1,name ="123"},{age = 2,name = "234"}}
t2 = {name = "xiaohei",sex = true}--插入
table.insert(t1,t2)
--删除指定元素
--remove方法 传表进去会移除最后一个索引的内容
table.remove(t1)
--两个参数,第一个是要移除内容的表,第二个是要移除内容的索引
table.remove(t1,1)
--排序方法
t3 = {4,2,3,6,4,1,7}
table.sort(t3)
for k in pairs(t3) doprint(t3[k])
end
--排序第二个参数可以提供排序方法
table.sort( t3, function(a,b)if a > b thenreturn trueend
end )--拼接
--连接函数 用于拼接表中的元素 返回值是一个字符串
tb = {"123","234","567","32323"}
str = table.concat(tb,",")
print(str)
多脚本执行
--全局变量和本地变量
--全局变量
a = 1
b = "123"for i = 1,2 doc = "xiaohei"
end
print(c)
--本地变量
for i = 1,2 dolocal d = "xiaohei"print("循环中的"..d)
end
print(d)--多脚本执行
--关键字 require("脚本名")
require("lesson2")
print(testA)--脚本卸载
--如果是require加载执行的脚本 加载过一次后不会再执行
require("lesson2")
--package.loaded["脚本名"]
--返回值是bool 意思该脚本是否被执行
package.loaded["lesson2"] = nil
local testLocalA = require("lesson2")
print(testLocalA)--大G表
--_G表是一个总表(table) 他将我们声明的所有全局变量都存储在其中
for k,v in pairs(_G) doprint(k,v)
end
--本地变量 添加了local的变量不会存储在其中
特殊用法
--多变量赋值
a,b,c = 1,2,"123"
print(a,b,c)
--多变量赋值,如果后面的值不够会自动补空
a,b,c = 1,2
print(a,b,c)
--如果后面的值多了,会自动省略
a,b,c = 1,2,3,4,5,6
print(a,b,c)--函数多返回值
function Test()return 10,20,30,40
end
a,b,c = Test()
print(a,b,c)--and or
--and or 不仅可以连接bool类型 任何东西都可以连接
--在lua中只有nil和false才是认为是假
--"短路" 对and来说 有假则假 对or来说 有真则真
print(1 and 2)
print(0 and 1)
print(nil and 1)
print(true or 1)
print(false or 1)
print(nil or 2)--Lua不支持三目运算符
x = 3
y = 2
local res = (x>y) and x or y
print(res)
协同程序
--协程的创建
--常用coroutine.create()
fun = function ()print(123)
endco = coroutine.create(fun)
--协程的本质是一个线程对象
print(co)--coroutine.wrap()
co2 = coroutine.wrap(fun)
print(co2)--协程的运行
--对应的是通过create创建的协程
coroutine.resume(co)
--第二种方式
co2()--协程的挂起
fun2 = function()local i = 1while true doprint(i)i = i + 1--协程的挂起函数coroutine.yield(i)end
endco3 = coroutine.create(fun2)
--默认第一个返回值是协程有没有启动成功,第二个是yield中的参数
isOK,tempI = coroutine.resume(co3)
print(isOK,tempI)
isOK,tempI = coroutine.resume(co3)
print(isOK,tempI)co4 = coroutine.wrap(fun2)
--没有bool值类型,直接返回yield中的参数
print(co4())
print(co4())--协程的状态
--coroutine.status(协程对象)
--dead 结束
--suspended 暂停
--running 进行中print(coroutine.status(co3))--可以得到正在运行的协程的协程号
coroutine.running()