Lua 概念 Lua是一种轻量、小巧的脚本语言,用标准的C语言编写并以源代码形式开发。设计目的是为了嵌入其他的程序中,从而为应用程序提供灵活的扩展和定制功能。
特性 和他语言相比,Lua有其自身的特点: (1)轻量级
1 lua用标准C语言编写并以源代码形式开发,编译后仅仅一百余千字节,可以很方便的嵌入道其他程序中。
(2)可扩展
1 lua提供非常丰富易于使用的扩展接口和机制,由宿主语言(通常是C或C++)提供功能,lua可以使用它们,就像内置的功能一样。
(3)支持面向过程编程和函数式编程
应用场景 游戏开发、独立应用脚本、web应用脚本、扩展和数据库插件、系统安全上。
安装 官网: https://www.lua.org/
1 2 3 4 5 6 7 8 9 10 11 [root@work env ]# wget https://www.lua.org/ftp/lua-5.4.6.tar.gz [root@work env ]# tar xvf lua-5.4.6.tar.gz [root@work lua-5.4.6]# make linux test [root@work lua-5.4.6]# make install cd src && mkdir -p /usr/local/bin /usr/local/include /usr/local/lib /usr/local/man/man1 /usr/local/share/lua/5.4 /usr/local/lib/lua/5.4cd src && install -p -m 0755 lua luac /usr/local/bincd src && install -p -m 0644 lua.h luaconf.h lualib.h lauxlib.h lua.hpp /usr/local/includecd src && install -p -m 0644 liblua.a /usr/local/libcd doc && install -p -m 0644 lua.1 luac.1 /usr/local/man/man1[root@work lua-5.4.6]# lua -v Lua 5.4.6 Copyright (C) 1994-2023 Lua.org, PUC-Rio
语法 他的语法和C/C++语法非常相似,整体上比较清晰,简洁。条件语句、循环语句、函数调用都与C/C++基本一致。
交互式HelloWorld 1 2 3 4 5 [root@work env ]# lua Lua 5.4.6 Copyright (C) 1994-2023 Lua.org, PUC-Rio > print ('hello world!!' ) hello world!! >
脚本式HelloWorld 第一种方式 1 2 3 4 5 6 7 [root@work ~]# mkdir lua_demo [root@work ~]# cd lua_demo/ [root@work lua_demo]# vim hello.lua [root@work lua_demo]# cat hello.lua print ('hello world!!!' )[root@work lua_demo]# lua hello.lua hello world!!!
第二种方式 1 2 3 4 5 6 7 [root@work lua_demo]# vim hello.lua [root@work lua_demo]# cat hello.lua print ('hello world!!!' )[root@work lua_demo]# chmod +x hello.lua [root@work lua_demo]# ./hello.lua hello world!!!
注释 1 2 3 4 5 6 7 8 9 10 %% 单行注释 %% %% 多行注释 %% %% 取消多行注释 %% print ("222" )
测试
1 2 3 4 5 6 7 8 9 10 11 [root@work lua_demo]# vim demo2.lua [root@work lua_demo]# cat demo2.lua -- print ("111" ) --[[ print ("222" ) --]] ---[[ print ("333" ) --]] [root@work lua_demo]# lua demo2.lua 333
标识符 标识符就是变量名,Lua定义变量名以 一个字母A到Z或a到z或下划线_开头后加上0个或者多个字母,下划线,数字(0-9)。这块建议最好不要使用下划线加大写字母的标识符,因为Lua的保留字也是这样定义的,容易发生冲突。注意Lua是区分大小写字母的。
关键字 下面Lua的关键词,大家在定义常量、变量或其他用户定义标识符都要避免使用一下关键字
and
break
do
else
elseif
end
false
for
function
if
in
local
nil
not
or
repeat
return
then
true
until
while
goto
一般约定,一以下划线开头连接一串大写字母的名字(比如_VERSION)被保留用于Lua内部全局变量。这个也是上面我们不建议这么定义标识符的原因
运算符 Lua中支持的运算符有算数运算符、关系运算符、逻辑运算符、其他运算符。
算数运算符 1 2 3 4 5 6 7 + 加 - 减 * 乘 / 除 % 取余 ^ 乘幂 - 负号
关系运算符 1 2 3 4 5 6 == 等于 ~= 不等于 > 大于 < 小于 >= 大于等于 <= 小于等于
逻辑运算符 1 2 3 and 与 同时true返回true or 或 一个true返回true not 非 取反
其他运算符 1 2 .. 连接两个字符串 # 一元预算法,返回字符串或表的长度
例如
1 2 3 4 5 6 7 [root@work lua_demo]# lua Lua 5.4.6 Copyright (C) 1994-2023 Lua.org, PUC-Rio > > print ('HELLO ' ..'WORLD' ) HELLO WORLD > print (#'hello' ) 5
全局变量&局部变量 在Lua语言中,全局变量无须声明即可使用。在默认情况下,变量总是认为是全局的,如果未提前赋值,默认为nil。如果想要声明一个局部变量需要使用local来声明。
1 2 3 4 5 6 7 8 9 10 11 [root@work lua_demo]# lua Lua 5.4.6 Copyright (C) 1994-2023 Lua.org, PUC-Rio > b=10 > print (b) 10 > local a = 100 > print (a) nil > local a = 100; print (a) 100 >
数据类型 全部的类型 Lua有8个数据类型
1 2 3 4 5 6 7 8 nil(空,无效值) boolean(布尔,true/false) number(数值) string(字符串) function(函数) table(表) thread(线程) userdata(数据用户)
可以使用type函数测试给定变量或者类型:
1 2 3 4 5 6 7 [root@work lua_demo]# lua Lua 5.4.6 Copyright (C) 1994-2023 Lua.org, PUC-Rio > print (type (nil)) nil > print (type ("aaa" )) string >
nil nil是一种只有一个nil值的类型,他的作用可以用来与其他所有值进行区分,也可以当想要移除一个变量时,只需要将该变量名赋值为nil,垃圾回收就会释放该变量所占用的内存。
boolean boolean类型具有两个值,true和false。在Lua中,只会将false和nil视为假,其他都是真,特别是在条件检测中0和空字符串都会认为是真,这个和我们熟悉的大多语言不太一样。
number 在lua5.3开始,lua语言为数值格式提供了两种选择:integer(整型)和float(双精度浮点型)[和其他语言不太一样,floatu代表单精度类型],u不管是整形还是双精度浮点型,使用type()函数来取其类型,返回的都是number。还有就是他们之间是可以直接相互转换的。
string Lua语言中的字符串可以标识单个字符,也可以标识一整本书籍。在Lua语言中,操作100k或者1M个字母组成的字符串的程序很常见。如果字符串数据很多可以这样写
1 2 3 4 5 6 7 a = [[ <html> xxx xxxx xxx </html> ]]
table table是lua语言中最主要和强大的数据结构。使用表,Lua语言可以以一种简单、统一且高效的方式标识数组、合集、记录和其他很多数据结构。Lua语言中的表本质上是一种辅助数组。这种数组比Java中的数组更加灵活,可以使用数值做索引,也可以使用字符串或其他任意类型的值做索引(nil除外)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 [root@work lua_demo]# lua Lua 5.4.6 Copyright (C) 1994-2023 Lua.org, PUC-Rio > a = {} > arr = {"TOM" ,"JERRY" ,"ROSE" } > print (arr[0]) nil > print (arr[1]) TOM > print (arr[2]) JERRY > print (arr[3]) ROSE > arr={} > arr["X" ]=10 > arr["Y" ]=20 > arr["Z" ]=30 > print (arr["X" ]) 10 > print (arr["Y" ]) 20 > print (arr["Z" ]) 30 > arr.X 10 > arr.Y 20 > arr.Y 20 > arr={"TOM" ,X=10,"JERRY" ,Y=20,"ROSE" ,Z=30} > arr[1] TOM > arr[2] JERRY > arr[3] ROSE > arr[4] nil > arr.X 10 > arr["X" ] 10 > arr.Z 30 >
function 在Lua语言中,函数(Function)是对语句和表达式进行抽象的主要方式 定义函数:
1 2 3 function functionName (params) code end
函数被调用的时候,传入的参数个数与定义函数时使用的参数个数不一致的时候,Lua会通过抛弃多余参数和将不足的参数设为nil的方式来调整数的个数。
1 2 3 4 5 6 7 8 9 10 11 12 13 [root@work lua_demo]# lua Lua 5.4.6 Copyright (C) 1994-2023 Lua.org, PUC-Rio > function f(a,b) >> print (a,b) >> end > f() nil nil > f(2) 2 nil > f(2,6) 2 6 > f(2,6,8) 2 6
可变参数
1 2 3 4 5 6 7 8 9 10 11 12 13 [root@work lua_demo]# lua Lua 5.4.6 Copyright (C) 1994-2023 Lua.org, PUC-Rio > function add(...) >> local a,b,c=... >> print (a,b,c) >> end > add(1,2,3) 1 2 3 > add(1) 1 nil nil > add(1,2,3,4,5,6) 1 2 3 >
返回值
1 2 3 4 5 6 7 8 9 10 11 [root@work lua_demo]# lua Lua 5.4.6 Copyright (C) 1994-2023 Lua.org, PUC-Rio > function add(a,b) >> return b,a >> end > x,y=add(100,200) > print (y) 100 > print (x) 200 >
控制结构 Lua语言提供了一组精简且常用的控制结构,包括用于条件执行的if以及用户循环的while、repeat和for。所有的控制语法上都有一个显示的终结符:end用于中介if、for以及while结构,until用于中介repeat结构。
if语句 if语句先测试其条件,并根据条件是否满足执行响应的then部分或else部分。else部分是可选的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 [root@work lua_demo]# lua Lua 5.4.6 Copyright (C) 1994-2023 Lua.org, PUC-Rio > function testif(a) >> if a>0 then >> print ("a是正数" ) >> end >> end > testif(2) a是正数 > testif(1) a是正数 > testif(-1) > function testif(a) >> if a>0 then >> print ("a是正数" ) >> else >> print ("a是负数" ) >> end >> end > testif(1) a是正数 > testif(-1) a是负数 >
嵌套IF相关案例如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 [root@work lua_demo]# lua Lua 5.4.6 Copyright (C) 1994-2023 Lua.org, PUC-Rio > function show(age) >> if age <= 18 then >> return "qingshaonian" >> elseif age>18 and age <=45 then >> return "qingnian" >> elseif age>45 and age <=60 then >> return "zhongnianren" >> else >> return "laonianren" >> end >> end > print (show(17)) qingshaonian > print (show(19)) qingnian > print (show(56)) zhongnianren > print (show(80)) laonianren
while循环 语法如下
案例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [root@work lua_demo]# lua Lua 5.4.6 Copyright (C) 1994-2023 Lua.org, PUC-Rio > function testwhile() >> local i=1 >> while i<=10 do >> print (i) >> i=i+1 >> end >> end > testwhile() 1 2 3 4 5 6 7 8 9 10
repeat循环 repeat-until语句回重复执行其循环体直到条件为真时结束。由于条件测试在循环体之后执行,所以至少会循环执行一次。 语法如下
案例如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [root@work lua_demo]# lua Lua 5.4 .6 Copyright (C) 1994 -2023 Lua.org, PUC-Rio > function testRepeat () >> local i = 10 >> repeat >> print (i) >> i=i-1 >> until i < 1 >> end > testRepeat() 10 9 8 7 6 5 4 3 2 1
for循环 数值型 语法如下
1 2 3 for param=exp1,exp2,exp3 do 循环体 end
param的值从exp1变化到exp2之前的每次循环会执行循环体,并在每次循环结束的时候步长,和python的for差不多。 案例如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [root@work lua_demo]# lua Lua 5.4.6 Copyright (C) 1994-2023 Lua.org, PUC-Rio > for i = 1,100,10 do >> print (i) >> end 1 11 21 31 41 51 61 71 81 91
泛型 泛型for循环是通过一个迭代器函数来遍历所有的值,类似于java中的foreach语句 语法
1 2 3 for i,v in ipairs (x) do 循环体 end
i是数组索引,v是对应索引的数组元素值,ipairs是Lua提供的一个迭代器函数,用来迭代数组,x是要遍历的数组。只后pairs也是Lua提供的夜歌迭代函数,他和ipairs的区别是pairs可以迭代一些指定键的table。 案例如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 [root@work lua_demo]# lua Lua 5.4.6 Copyright (C) 1994-2023 Lua.org, PUC-Rio > arr = {"TOME" ,"JERRY" ,"ROWS" ,"LUCY" } > for i,v in ipairs(arr) do >> print (i,v) >> end 1 TOME 2 JERRY 3 ROWS 4 LUCY [root@work lua_demo]# lua Lua 5.4.6 Copyright (C) 1994-2023 Lua.org, PUC-Rio > arr = {"TOM" ,"JERRY" ,"ROSES" ,x="JACK" ,"LUCY" } > function testfor(arr) >> for i,v in pairs(arr) do >> print (i,v) >> end >> end > testfor(arr) 1 TOM 2 JERRY 3 ROSES 4 LUCY x JACK