lua语法
一.介绍
Lua 是一门轻量级、高效、可嵌入的脚本语言,被设计用于扩展应用程序的功能,核心解释器非常小(编译后甚至不到1MB)。Lua 的灵魂是可嵌入C/C++、Java、C# 等主机程序中运行。程序可以通过 Lua 来提供灵活的配置和扩展功能,而无需修改主程序本身的代码。
主要应用领域:
--游戏开发:使用 Lua 来编写游戏逻辑
--应用程序扩展:Wireshark、Nginx、Redis等使用 Lua 让用户自定义功能或编写插件
lua文档首页:https://wiki.luatos.com/index.html
在线文档:https://wiki.luatos.com/luaGuide/introduction.html
由于lua可以直接在浏览器中运行, 这时使用在线文档luatos-->在线体验luatos-->lua测试。
二.语法介绍
2.1 声明
print("hello world") --变量声明,与py相似,默认是全局变量 a=1 b=2 -- 加上local就是局部变量,例如在当前代码块或函数 local c=3 --没有被声明过的变量是nil类型,下面的d和f都是nil类型 print(d) e,f=1 print(e,f) --可以在一行中声明多个变量 a,c=1,2 print(a,b) --所有数值型都是number类型,还支持16进制hex, h输出为10 g=1 h=0xa print(g,h) --支持科学计数法,如下2后面有10个0, 值为:20000000000.0 j=2e10 print(j) --支持加减乘除 print(a+c) --支持幂运算,输出100000 print(10^5)
2.2字符串
-- 声明字符串,单双引号都可以 str="aefsef" str1='我是中国人' --支持转义字符,下面\n 输出时world已换行 s1="hello\nworld" print(s1) --多行文本,输出时也是三行 mutiline=[[你好 我是 中国人 ]] print(mutiline) --字符串连接,例如str连接str1,不是通过相加,而是.. s2=str..str1 print(s2) --将数字转为字符串 s3=tostring(10) print(s3) --将字符串转成数值型 n=tonumber("10") print(n) --如果将字符串转成数值型失败,n1值为nil n1=tonumber("10abc") print(n1) --获取字符串长度,在前面加#号,如#str 输出为6 print(#str)
三.函数
--第一种声明法 function function_name(a,b) print(a,b) end --第一种声明法 function_name2=function(c,d) print(c,d) end --调用函数 function_name(1,3) function_name2(2,4) --函数返回值,默认返回nil, 可以用return来返回 function function_name3(a) return a end print(function_name3('hello world')) --返回多个值 function function_name3(a,b) return a,b end local i,j=function_name3(1,2) print(i,j)
四.table表
table相当于python中的list, 下面代码是通过下标来操作
--table 可以存任意类型,用逗号分隔,第3个存的又是一个table,第4个是匿名函数 table1={1,"ab",{},function() print("我是一个匿名函数") end} --提取时可以通过索引下标,注意下标从1开始 print(table1[1]) --输出 1 print(table1[2]) --输出 ab print(table1[4]) --输出 0x154 函数引用的内存地址是16进制,在python中将16转为10进制,int("0x154",16) 输出340 local myFunction =table1[4] myFunction() --取没有的下标为nil print(table1[5]) --可以把table1中继续添加下标 table1[5]='123' print(table1[5]) --还可以调用table的方法,如插入元素,默认是追加 table.insert(table1, "第6个下标") print(table1[6]) --插入元素,还可以是指定下标,这样后面的每个元素下标后移一位 table.insert(table1,2,"在2下标插入元素") --移除命令, 指定下标移除,返回移除的下标值,后面每个的每个元素下标前移一位, local val=table.remove(table1, 2) print(val)
下面table是通过字符串来操作,这样的好处是 避免索引下标变动而错误
--定义table,通过字符串来操作 table1={ a=1, b='1234', c=function() end, d=12345, [",;"]=123 --不规范的变量名定义 } --输出 print(table1["a"]) print(table1.a) print(table1[",;"]) --添加元素 table1["abc"]=12345 print(table1["abc"]) --没有声明过的下标,读取为nil print(table1["def"])
5.全局table表
--全局table表 _G 所有全局变量都在_G中 --声明全局变量 a=1 --输出值为1 print(_G["a"]) --平时我们用table.insert来添加指定table的元素, 可以看出table也是一个全局变量 print(_G["table"]) --输出16进制内存地址 print(_G["table"]["insert"])--输出16进制内存地址
6.真和假判断
--布尔型,只有true和false,在lua中只有nil和false代表假 a=true b=false print(1>2) print(1<2) print(1>=2) print(1<=2) print(1==2) print(1~=2)--不等于判断 -- and(与)、 or(或)、 not(非) --规则:如果第一个参数为 false 或 nil,则返回第一个参数;否则返回第二个参数 print(a and b) --false, 两个为true,返回true print(a or b) --true ,有一个true,返回true print(not b) --true, 取b的相反值。 --只有not返回true和false, 而and 和 or 不全是返回true和false a=nil --假 b=0 --真 print(a and b) --返回nil print(b>10 and "yes" or "no")--返回no
7.if分支
a,b=10,4 if a>b then print('a大于b') elseif (a==b) then print('a等于b') else print('a小于b') end --0代表真 if 0 then print("0 is true") end
8.循环
下面是for循环示例
--循环从1开始,到10结束,包含10, 在循环中变量i是不可修改的 for i=1,10 do print(i) end --循环+ 步长 输出1,3,5,7,9 for i=1,10,2 do print(i) end --循环 + 步长为负数 ,输出10,9,8...1 for i=10,1,-1 do print(i) end -- break 退出 for i=1,10 do print(i) if i==5 then break end end
下面是while示例
--while循环 local n=10 while n>0 do print(n) n=n-1 end --break 退出 local z = 10 while z>0 do print(z) if z==5 then break end z=z-1 end
9.语法补充
--0x30在ASCII编码中对应十进制数值48,代表数字字符'0' local s=string.char(0x30,0x31) print(s)--数字字符'0' --0x31对应的十进制数值 输出49 local n=string.byte(s,2) print(n)
浙公网安备 33010602011771号