十一、【Lua】
11.1.概念
11.2.特性
跟其他语言进行比较,Lua有其自身的特点:
11.2.1.轻量级
Lua用标准C语言编写并以源代码形式开发,编译后仅仅一百余千字节,可以很方便的嵌入到其他程序中。
11.2.2.可扩展
Lua提供非常丰富易于使用的扩展接口和机制,由宿主语言(通常是C或C++)提供功能,Lua可以使用它们,就像内置的功能一样。
11.2.3.支持面向过程编程和函数式编程
11.3.应用场景
Lua在不同的系统中得到大量应用,场景的应用场景如下:
游戏开发、独立应用脚本、web应用脚本、扩展和数据库插件、系统安全上。
11.4.Lua的安装
在linux上安装Lua非常简单,只需要下载源码包并在终端解压、编译即可使用。
Lua的官网地址为:https://www.lua.org
11.4.1. 点击download可以找到对应版本的下载地址
使用wget命令直接下载:
mkdir -p /lua/core cd /lua/core wget https://www.lua.org/ftp/lua-5.4.6.tar.gz tar -zxf lua-5.4.6.tar.gz
11.4.2. 编译安装
cd lua-5.4.6 # 测试当前Linux环境是否适合安装lua make linux test make install #卸载 #make uninstall
11.4.3.如果在执行make linux test失败,报如下错误:
说明当前系统缺少libreadline-dev依赖包,需要通过命令来进行安装
yum install -y readline-devel
11.4.4.验证是否安装成功
lua -v
11.5.Lua的语法
Lua和C/C++语法非常相似,整体上比较清晰,简洁。条件语句、循环语句、函数调用都与C/C++基本一致。
11.5.1.第一个Lua程序
Lua有两种交互方式,分别是:交互式和脚本式
交互式之HELLOWORLD
交互式是指可以在命令行输入程序,然后回车就可以看到运行的效果。
Lua交互式编程模式
可以通过命令lua -i 或lua
来启用;在命令行中key输入如下命令,并按回车,会有输出在控制台
脚本式之HELLOWORLD
脚本式是将代码保存到一个以lua为扩展名的文件中并执行的方式。
方式一:
我们需要一个文件名为 hello.lua,在文件中添加要执行的代码,然后通过命令 lua hello.lua
来执行,会在控制台输出对应的结果。
hello.lua
print("Hello World!!")
方式二:
将hello.lua做如下修改
#!/usr/local/bin/lua print("Hello World!!!")
第一行用来指定Lua解释器所在位置为 /usr/local/bin/lua
,加上#号标记解释器会忽略它。
一般情况下#!就是用来指定用哪个程序来运行本文件
。
但是hello.lua并不是一个可执行文件
,需要通过chmod来设置可执行权限
,最简单的方式为:
chmod 755 hello.lua
然后执行该文件
./hello.lua
补充一点,如果想在交互式中运行脚本式的hello.lua中的内容,我们可以使用一个dofile函数,如:
dofile("lua_demo/hello.lua")
注意:在Lua语言中,连续语句之间的分隔符并不是必须的
,也就是说后面不需要加分号
,当然加上也不会报错,
在Lua语言中,表达式之间的换行也起不到任何作用。如以下四个写法,其实都是等效的
写法一 a=1 b=a+2 写法二 a=1; b=a+2; 写法三 a=1; b=a+2; 写法四 a=1 b=a+2
不建议使用第四种方式,可读性太差。
11.5.2.Lua的注释
关于Lua的注释要分两种,第一种是单行注释,第二种是多行注释。
单行注释的语法为:
--注释内容
多行注释的语法为:
--[[ 注释内容 注释内容 --]]
如果想取消多行注释,只需要在第一个–之前在加一个-即可,如:
---[[ 注释内容 注释内容 --]]
11.5.3.标识符
换句话说标识符就是我们的变量名,Lua定义变量名以一个字母 A 到 Z 或 a 到 z 或下划线 _ 开头后加上0个或多个字母,下划线,数字(0到9)。这块建议大家最好不要使用下划线加大写字母的标识符,因为Lua的保留字也是这样定义的,容易发生冲突。注意Lua是区分大小写字母的。
A0
11.5.4.关键字
下列是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 内部全局变量。这个也是上面我们不建议这么定义标识符的原因。
11.5.5.运算符
Lua中支持的运算符有算术运算符、关系运算符、逻辑运算符、其他运算符。
算术运算符:
+ 加法 - 减法 * 乘法 / 除法 % 取余 ^ 乘幂 - 负号
例如:
10+20 -->30 20-10 -->10 10*20 -->200 20/10 -->2 3%2 -->1 10^2 -->100 -10 -->-10
关系运算符
== 等于 ~= 不等于 > 大于 < 小于 >= 大于等于 <= 小于等于
例如:
10==10 -->true 10~=10 -->false 20>10 -->true 20<10 -->false 20>=10 -->true 20<=10 -->false
逻辑运算符
and 逻辑与 A and B && or 逻辑或 A or B || not 逻辑非 取反,如果为true,则返回false !
逻辑运算符可以作为if的判断条件,返回的结果如下:
A = true B = true A and B -->true A or B -->true not A -->false A = true B = false A and B -->false A or B -->true not A -->false A = false B = true A and B -->false A or B -->true not A -->true
其他运算符
.. 连接两个字符串 # 一元预算法,返回字符串或表的长度
例如:
> "HELLO ".."WORLD" -->HELLO WORLD > #"HELLO" -->5
11.5.6.全局变量&局部变量
在Lua语言中,全局变量无须声明即可使用
。在默认
情况下,变量
总是认为是全局的
,如果未提前赋值,默认为nil:
要想声明一个局部变量,需要使用local来声明
11.6.Lua数据类型
11.6.1.Lua有8个数据类型
nil(空,无效值) boolean(布尔,true/false) number(数值) string(字符串) function(函数) table(表) thread(线程) userdata(用户数据)
可以使用type函数测试给定变量或者的类型:
print(type(nil)) -->nil print(type(true)) --> boolean print(type(1.1*1.1)) --> number print(type("Hello world")) --> string print(type(io.stdin)) -->userdata print(type(print)) --> function print(type(type)) -->function print(type{
}) -->table print(type(type(X))) --> string
11.6.2.nil
nil是一种只有一个nil值的类型,它的作用可以用来与其他所有值进行区分,也可以当想要移除一个变量时,只需要将该变量名赋值为nil,垃圾回收就会会释放该变量所占用的内存。
11.6.3.boolean
boolean类型具有两个值,true和false。boolean类型一般被用来做条件判断的真与假。在Lua语言中,只会将false和nil视为假
,其他的都视为真
,特别是在条件检测中0和空字符串都会认为是真
,这个和我们熟悉的大多数语言不太一样。
11.6.4.number
在Lua5.3版本开始,Lua语言为数值格式提供了两种选择:integer(整型)和float(双精度浮点型)[和其他语言不太一样,float不代表单精度类型]。
数值常量的表示方式:
>4 -->4 >0.4 -->0.4 >4.75e-3 -->0.00475 >4.75e3 -->4750
不管是整型还是双精度浮点型,使用type()函数来取其类型,都会返回的是number
>type(3) -->number >type(3.3) -->number
所以它们之间是可以相互转换的,同时,具有相同算术值的整型值和浮点型值在Lua语言中是相等的
11.6.5.string
Lua语言中的字符串即可以表示单个字符,也可以表示一整本书籍。在Lua语言中,操作100K或者1M个字母组成的字符串的程序很常见。
可以使用单引号或双引号来声明字符串
>a = "hello" >b = 'world' >print(a) -->hello >print(b) -->world
如果声明的字符串比较长或者有多行,则可以使用如下方式进行声明
html = [[ <html> <head> <title>Lua-string</title> </head> <body> <a href="http://www.lua.org">Lua</a> </body> </html> ]]
11.6.6.table
table是Lua语言中最主要和强大的数据结构。使用表, Lua 语言可以以一种简单、统一且高效的方式表示数组、集合、记录和其他很多数据结构。 Lua语言中的表本质上是一种辅助数组。这种数组比Java中的数组更加灵活,可以使用数值做索引,也可以使用字符串或其他任意类型的值作索引(除nil外)。
创建表的最简单方式:
> a = {
}
创建数组:
我们都知道数组就是相同数据类型的元素按照一定顺序排列的集合,那么使用table如何创建一个数组呢?
>arr = {
"TOM","JERRY","ROSE"}
要想获取数组中的值,我们可以通过如下内容来获取:
print(arr[0]) nil print(arr[1]) TOM print(arr[2]) JERRY print(arr[3]) ROSE
从上面的结果可以看出来,数组的下标默认是从1开始的。所以上述创建数组,也可以通过如下方式来创建
>arr = {
} >arr[1] = "TOM" >arr[2] = "JERRY" >arr[3] = "ROSE"
上面我们说过了,表的索引即可以是数字,也可以是字符串等其他的内容,所以我们也可以将索引更改为字符串来创建
>arr = {
} >arr["X"] = 10 >arr["Y"] = 20 >arr["Z"] = 30
当然,如果想要获取这些数组中的值,可以使用下面的方式
方式一 >print(arr["X"]) >print(arr["Y"]) >print(arr["Z"]) 方式二 >print(arr.X) >print(arr.Y) >print(arr.Z)
当前table的灵活不进于此,还有更灵活的声明方式
>arr = {
"TOM",X=10,"JERRY",Y=20,"ROSE",Z=30}
如何获取上面的值?
TOM : arr[1] 10 : arr["X"] | arr.X JERRY: arr[2] 20 : arr["Y"] | arr.Y ROESE: arr[3]
11.6.7.function
在 Lua语言中,函数( Function )是对语句和表达式进行抽象的主要方式。
定义函数的语法为:
function functionName(params) end
函数被调用的时候,传入的参数个数与定义函数时使用的参数个数不一致的时候,Lua 语言会通过 抛弃多余参数和将不足的参数设为 nil 的方式来调整参数的个数。
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 (8被丢弃)
可变长参数函数
function add(...) a,b,c=... print(a) print(b) print(c) end add(1,2,3) --> 1 2 3
函数返回值可以有多个,这点和Java不太一样
function f(a,b) return a,b end x,y=f(11,22) --> x=11,y=22
11.6.8.thread
thread翻译过来是线程的意思,在Lua中,thread用来表示执行的独立线路,用来执行协同程序。
11.6.9.userdata
userdata是一种用户自定义数据,用于表示一种由应用程序或C/C++语言库所创建的类型。
11.7.Lua控制结构
11.7.1.if then elseif else
if语句先测试其条件,并根据条件是否满足执行相应的 then 部分或 else 部分。 else 部分 是可选的。
function testif(a) if a>0 then print("a是正数") end end function testif(a) if a>0 then print("a是正数") else print("a是负数") end end
如果要编写嵌套的 if 语句,可以使用 elseif。 它类似于在 else 后面紧跟一个if。根据传入的年龄返回不同的结果,如
age<=18 青少年, age>18 , age <=45 青年 age>45 , age<=60 中年人 age>60 老年人 function show(age) if age <= 18 then return "青少年" elseif age > 18 and age <= 45 then return "青年" elseif age > 45 and age <= 60 then return "中年人" else return "老年人" end end
11.7.2.while循环
顾名思义,当条件为真时 while 循环会重复执行其循环体。 Lua 语言先测试 while 语句 的条件,若条件为假则循环结束;否则, Lua 会执行循环体并不断地重复这个过程。
语法:
while 条件 do 循环体 end
例子:实现数组的循环
function testWhile() local i = 1 while i<=10 do print(i) i=i+1 end end
11.7.3.repeat循环
语法
repeat 循环体 until 条件
function testRepeat() local i = 10 repeat print(i) i=i-1 until i < 1 end
11.7.4.for循环
数值型for循环
语法
for param=exp1,exp2,exp3 do 循环体 end
param的值从exp1变化到exp2之前的每次循环会执行 循环体,并在每次循环结束后将步长(step)exp3增加到param上。exp3可选,如果不设置默认为1
for i = 1,100,10 do print(i) end
泛型for循环
泛型for循环通过一个迭代器函数来遍历所有值,类似于java中的foreach语句。
语法
for i,v in ipairs(x) do 循环体 end
i是数组索引值,v是对应索引的数组元素值,ipairs是Lua提供的一个迭代器函数,用来迭代数组,x是要遍历的数组。
例如:
arr = {
"TOME","JERRY","ROWS","LUCY"} for i,v in ipairs(arr) do print(i,v) end
上述实例输出的结果为
1 TOM 2 JERRY 3 ROWS 4 LUCY
但是如果将arr的值进行修改为
arr = {
"TOME","JERRY","ROWS",x="JACK","LUCY"}
同样的代码在执行的时候,就只能看到和之前一样的结果,而其中的x为JACK就无法遍历出来,缺失了数据,如果解决呢?
我们可以将迭代器函数变成pairs,如
for i,v in pairs(arr) do print(i,v) end
上述实例就输出的结果为
1 TOM 2 JERRY 3 ROWS 4 LUCY x JACK
endl
到此这篇Lua脚本_用lua写图色脚本的脚本软件的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/luakf/2004.html