变量
number(表示所有数字) string boolean nil(与C#中的null类似)
四种复杂的变量类型 fuction(函数) table(表) userdata(数据结构) thread(协同程序)
type函数 得到变量的类型返回值是一个string
bash
a = 1
a = type(a)
print(a)
Lua中可以直接使用没有初始化的变量,默认为nil
Lua中不用指明变量类型 可自动识别
字符串操作
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())
运算符
Lua
--算术运算符
-- + - * / %
-- 没有自增自减 ++ -- 没有复合运算符 += -=
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)--取反
--不支持位运算符 & |
--不支持三目运算符 ? :
条件分支语句
Lua
a = 9
--单分支
--if 条件 then....end
if a > 5 then
print("1111")
end
--双分支
--if 条件 then..else..end
if a > 5 then
print("1111")
else
print("2222")
end
--多分支
--if 条件 then..elseif 条件 then..end
if a > 5 then
print("1111")
elseif a > 3 then
print("2222")
elseif a > 2 then
print("3333")
else
print("4444")
end
--lua中没有switch语法
循环语句
Lua
--while语句
num = 0
--while 条件 do .... end
while num < 5 do
print(num)
num = num + 1
end
--do while语句
num = 0
--repeat ......until 条件(注意:条件是结束条件)
repeat
print(num)
num = num + 1
until num > 5 --满足条件跳出 结束条件
--for循环
--for 起始值,结束值,增量 do.....end
for i = 1,5 do --i会默认递增
print(i)
end
for i = 1,5,2 do --自定义增量,第三个参数为每次递增多少
print(i)
end
for i = 5,1,-1 do
print(i)
end
函数
Lua
--function 函数名()
-- body
--end
--a = function()
--end
--无参数无返回值
function F1()
print("F1")
end
F1()
F2 = function()
print("F2")
end
F2()
--有参数
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 do
print(arg[i])
end
end
F7(1,2,3,4,"5",6,true,8)
--函数嵌套
function F8()
return function()
print(123)
end
end
F9 = F8()
F9()
--闭包
function F10(x)
--改变传入参数的生命周期
return function(y)
return x+y
end
end
F11 = F10(10)
print(F11(9))
复杂数据类型 table
Lua
--所有的复杂类型都是table(表)
--数组
a = {1,2,3,"4",nil,5}
--Lua中索引从1开始
print(a[1])
--#是通用的获取长度的关键字
--打印长度时nil如果在最后一位会被忽略
print(#a)
--数组遍历
for i=1,#a do
print(a[i])
end
--二维数组
a = {{1,2,3,4},{5,6,7,8}}
print(a[1][1]) --第一个中括号表示第几个表,第二个表示当前表中第几个元素
--二维数组遍历
for i=1,#a do
b = a[i]
for j=1,#b do
print(b[j])
end
end
--自定义索引
--计算长度忽略小于0的索引
aa = {[0] = 1, 2 , 3 ,[-1] = 4 ,5}
print(aa[0])
print(aa[-1])
迭代器遍历
Lua
a = {[0] = 1,2,3,4,5,6,[-1]=7}
--ipairs
--[[
ipairs遍历 还是从1开始往后遍历的 小于等于0的值得不到
只能找到连续索引的键 如果中间断序也无法遍历出后面的值
]]
for i,k in ipairs(a) do
print(i,k)
end
--pairs
--它能够找到所有键
for k,v in pairs(a) do
print(k,v)
end
for i in pairs(a) do
--只遍历键
print(i)
end
字典
Lua
--字典的声明
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) do
print(k,v)
end
print("***************")
for k in pairs(a) do
print(k,a[k])
end
类和结构体
Lua
--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()
表的公共操作
Lua
--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) do
print(t3[k])
end
--排序第二个参数可以提供排序方法
table.sort( t3, function(a,b)
if a > b then
return true
end
end )
--拼接
--连接函数 用于拼接表中的元素 返回值是一个字符串
tb = {"123","234","567","32323"}
str = table.concat(tb,",")
print(str)
多脚本执行
Lua
--全局变量和本地变量
--全局变量
a = 1
b = "123"
for i = 1,2 do
c = "xiaohei"
end
print(c)
--本地变量
for i = 1,2 do
local 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) do
print(k,v)
end
--本地变量 添加了local的变量不会存储在其中
特殊用法
Lua
--多变量赋值
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)
协同程序
Lua
--协程的创建
--常用coroutine.create()
fun = function ()
print(123)
end
co = coroutine.create(fun)
--协程的本质是一个线程对象
print(co)
--coroutine.wrap()
co2 = coroutine.wrap(fun)
print(co2)
--协程的运行
--对应的是通过create创建的协程
coroutine.resume(co)
--第二种方式
co2()
--协程的挂起
fun2 = function()
local i = 1
while true do
print(i)
i = i + 1
--协程的挂起函数
coroutine.yield(i)
end
end
co3 = 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()