Lua语法

变量

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()
相关推荐
怀旧,2 小时前
【C++】26. 智能指针
开发语言·c++·算法
Aevget2 小时前
PHP智能开发工具PhpStorm v2025.2全新上线——支持PHPUnit 12等
开发语言·ide·php·phpstorm
东方芷兰3 小时前
JavaWeb 课堂笔记 —— 20 SpringBootWeb案例 配置文件
java·开发语言·笔记·算法·log4j·intellij-idea·lua
许商3 小时前
【stm32】bash自动配置buildenv
开发语言·bash
reembarkation3 小时前
自定义分页控件,只显示当前页码的前后N页
开发语言·前端·javascript
楼田莉子3 小时前
vscode搭建C/C++配置开发环境
c语言·开发语言·c++·vscode·学习·编辑器
我要精通C++3 小时前
lua虚拟机的垃圾回收机制
java·开发语言
22jimmy3 小时前
MyBatis动态sql
java·开发语言·mybatis
那我掉的头发算什么4 小时前
【数据结构】双向链表
java·开发语言·数据结构·链表·intellij-idea·idea