当前位置: 首页 > news >正文

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()

http://www.dtcms.com/a/438119.html

相关文章:

  • stm32摇杆adc数据分析
  • 公司网站开发费用如何做账网站三合一建设
  • MySQL 进阶知识点(十二)---- 管理
  • C/C++贪吃蛇小游戏
  • 【Linux】多线程创建及封装
  • 苏州网站推广公司创业商机网餐饮
  • unity 读取PPT显示到屏幕功能
  • Django - 让开发变得简单高效的Web框架
  • C# 判断语句详解
  • 新建一个网站需要多少钱舟山专业做网站
  • JVM中的垃圾回收机制
  • 【计算机视觉】概述
  • 【第五章:计算机视觉-项目实战之生成对抗网络实战】2.基于SRGAN的图像超分辨率实战-(2)实战1:DCGAN模型搭建
  • 【精品资料鉴赏】大型企业网络安全整体解决方案
  • 重庆建设医院官方网站wordpress中文社区
  • [优选算法专题三.二分查找——NO.23搜索旋转排序数组中的最⼩值]
  • 【个人修养】商务礼仪教程
  • 报告派研读:2025年全球PC/主机游戏洞察报告
  • 用jquery做的书籍网站discuz做服务网站
  • Linux 驱动开发入门:LCD 驱动与内核机制详解
  • [Linux基础——Lesson9.调试器GDB]
  • 网站 推送中国万网域名官网
  • 主窗口(QMainWindow)如何放入文本编辑器(QPlainTextEdit)等继承自QWidget的对象--(重构版)
  • 和 AI 一起修 Bug 心得体会
  • 网站建设科技公司外部环境分析网站首页没有权重
  • 【大语言模型】—— Transformer的QKV及多头注意力机制图解解析
  • SYN VISION韩国发布会:获评非小号Alpha,战略合作PrompTale
  • 安徽工程建设造价信息网站html网站开发视频
  • 图书馆自习室|基于SSM的图书馆自习室座位预约小程序设计与实现(源码+数据库+文档)
  • Ollama 使用详解:本地部署大语言模型的指南