Lua
概念
Lua是一种轻量、小巧的脚本语言,用标准的C语言编写并以源代码形式开发。设计目的是为了嵌入其他的程序中,从而为应用程序提供灵活的扩展和定制功能。
特性
和他语言相比,Lua有其自身的特点:
(1)轻量级
lua用标准C语言编写并以源代码形式开发,编译后仅仅一百余千字节,可以很方便的嵌入道其他程序中。
(2)可扩展
lua提供非常丰富易于使用的扩展接口和机制,由宿主语言(通常是C或C++)提供功能,lua可以使用它们,就像内置的功能一样。
(3)支持面向过程编程和函数式编程
应用场景
游戏开发、独立应用脚本、web应用脚本、扩展和数据库插件、系统安全上。
安装
[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.4
cd src && install -p -m 0755 lua luac /usr/local/bin
cd src && install -p -m 0644 lua.h luaconf.h lualib.h lauxlib.h lua.hpp /usr/local/include
cd src && install -p -m 0644 liblua.a /usr/local/lib
cd 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
[root@work env]# lua
Lua 5.4.6 Copyright (C) 1994-2023 Lua.org, PUC-Rio
> print('hello world!!')
hello world!!
>
脚本式HelloWorld
第一种方式
[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!!!
第二种方式
[root@work lua_demo]# vim hello.lua
[root@work lua_demo]# cat hello.lua
#! /usr/local/bin/lua
print('hello world!!!')
[root@work lua_demo]# chmod +x hello.lua
[root@work lua_demo]# ./hello.lua
hello world!!!
注释
%% 单行注释 %%
-- print("111")
%% 多行注释 %%
--[[
print("222")
--]]
%% 取消多行注释 %%
---[[
print("222")
--]]
测试
[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中支持的运算符有算数运算符、关系运算符、逻辑运算符、其他运算符。
算数运算符
+ 加
- 减
* 乘
/ 除
% 取余
^ 乘幂
- 负号
关系运算符
== 等于
~= 不等于
> 大于
< 小于
>= 大于等于
<= 小于等于
逻辑运算符
and 与 同时true返回true
or 或 一个true返回true
not 非 取反
其他运算符
.. 连接两个字符串
# 一元预算法,返回字符串或表的长度
例如
[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来声明。
[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个数据类型
nil(空,无效值)
boolean(布尔,true/false)
number(数值)
string(字符串)
function(函数)
table(表)
thread(线程)
userdata(数据用户)
可以使用type函数测试给定变量或者类型:
[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个字母组成的字符串的程序很常见。如果字符串数据很多可以这样写
a = [[
<html>
xxx
xxxx
xxx
</html>
]]
table
table是lua语言中最主要和强大的数据结构。使用表,Lua语言可以以一种简单、统一且高效的方式标识数组、合集、记录和其他很多数据结构。Lua语言中的表本质上是一种辅助数组。这种数组比Java中的数组更加灵活,可以使用数值做索引,也可以使用字符串或其他任意类型的值做索引(nil除外)
[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)是对语句和表达式进行抽象的主要方式
定义函数:
function functionName(params)
code
end
函数被调用的时候,传入的参数个数与定义函数时使用的参数个数不一致的时候,Lua会通过抛弃多余参数和将不足的参数设为nil的方式来调整数的个数。
[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
可变参数
[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
>
返回值
[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部分是可选的。
[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相关案例如下
[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循环
语法如下
while 条件 do
循环体
end
案例
[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语句回重复执行其循环体直到条件为真时结束。由于条件测试在循环体之后执行,所以至少会循环执行一次。
语法如下
repeat
循环体
until 条件
案例如下
[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循环
数值型
语法如下
for param=exp1,exp2,exp3 do
循环体
end
param的值从exp1变化到exp2之前的每次循环会执行循环体,并在每次循环结束的时候步长,和python的for差不多。
案例如下
[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语句
语法
for i,v in ipairs(x) do
循环体
end
i是数组索引,v是对应索引的数组元素值,ipairs是Lua提供的一个迭代器函数,用来迭代数组,x是要遍历的数组。只后pairs也是Lua提供的夜歌迭代函数,他和ipairs的区别是pairs可以迭代一些指定键的table。
案例如下
[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