一、概述
Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。官网:https://www.lua.org/
Lua经常嵌入到C语言开发的程序中,例如游戏开发、游戏插件、Nginx拓展等。
跟其他语言进行比较,Lua有其自身的特点:
(1)轻量级
Lua用标准C语言编写并以源代码形式开发,编译后仅仅一百余千字节,可以很方便的嵌入到其他程序中。(2)可扩展
Lua提供非常丰富易于使用的扩展接口和机制,由宿主语言(通常是C或C++)提供功能,Lua可以使用它们,就像内置的功能一样。(3)支持面向过程编程和函数式编程
二、基础语法
在Lua语言中,连续语句之间的分隔符并不是必须的,也就是说后面不需要加分号,当然加上也不会报错
2.1 运行
#通过lua -i 或 lua启用交互式
# 脚本时,lua 文件名
<NolebasePageProperties />
lua hello.lua
#可在脚本文件中添加 #!/usr/local/bin/lua 指定程序运行文件。
# 需要对该文件进行授权,授权后可直接运行
chmod 755 hello.lua
./hello.lua
# 交互式时运行脚本文件。
dofile("lua_demo/hello.lua")2.2 变量
在Lua语言中,全局变量无须声明即可使用。在默认情况下,变量总是认为是全局的,如果未提前赋值,默认为nil:
声明一个局部变量,需要使用local来声明
| 数据类型 | 描述 |
|---|---|
| nil | 这个最简单,只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)。 当想要移除一个变量时,只需要将该变量名赋值为nil,垃圾回收就会会释放该变量所占用的内存。 |
| boolean | 包含两个值:false和true 只会将false和nil视为假,其他的都视为真,特别是在条件检测中0和空字符串都会认为是真,这个和我们熟悉的大多数语言不太一样。 |
| number | 表示双精度类型的实浮点数 |
| string | 字符串由一对双引号或单引号来表示,如果声明的字符串比较长或者有多行可使用 [[文本内容]]生命 |
| function | 由 C 或 Lua 编写的函数 |
| table | Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字、字符串或表类型。在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。 |
| thread | 线程,thread用来表示执行的独立线路,用来执行协同程序。 |
| userdata | 用户数据,是一种用户自定义数据,用于表示一种由应用程序或C/C++语言库所创建的类型。 |
声明变量
-- 声明字符串,可以用单引号或双引号,
local str = 'hello'
-- 字符串拼接可以使用 ..
local str2 = 'hello' .. 'world'
-- 声明数字
local num = 21
-- 声明布尔类型
local flag = true
-- 声明数组 ,key为角标的 table,下表从1开始
local arr = {'java', 'python', 'lua'}
-- 声明table,类似java的map
local map = {name='Jack', age=21}
-- 访问数组,lua数组的角标从1开始,当数组和key的重复时,数组值得下表计算与key不关联。累加 1 2
print(arr[1])
-- 访问table
print(map['name'])
print(map.name)
-- 定义函数的语法 当入参个数与形参个数不一致时,缺失参数以nil补全。多余参数丢弃
-- 函数返回值可以有多个
-- function前可以加修饰范围的,制定函数是全局函数还是局部函数,未设置该参数默认为全局函数,如果你需要设置函数为局部函数需要使用关键字 local。
-- 有返回值是,可以通过return返回,可以有多个返回值。
function functionName(params)
end
-- 可变参数
function add(...)
a,b,c=...
print(a)
print(b)
print(c)
end
-- 获取变量类型
type(变量名)2.3 逻辑处理
遍历
-- 声明数组 key为索引的 table
local arr = {'java', 'python', 'lua'}
-- 遍历数组
for index,value in ipairs(arr) do
print(index, value)
end
-- 声明map,也就是table
local map = {name='Jack', age=21}
-- 遍历table
for key,value in pairs(map) do
print(key, value)
end条件判断
-- 逻辑判断基于英文单词 and or not
if(布尔表达式) then
--[ 布尔表达式为 true 时执行该语句块 --]
elseif(布尔表达式) then
else
--[ 布尔表达式为 false 时执行该语句块 --]
end循环
-- while循环
while 条件 do
循环体
end
-- repeat循环
repeat
循环体
until 条件
-- for循环
-- exp1开始值 exp2 结束值 exp3 步长 默认1
for param=exp1,exp2,exp3 do
循环体
end
-- 泛型for循环
-- i是数组索引值,v是对应索引的数组元素值,ipairs是Lua提供的一个迭代器函数,用来迭代数组,x是要遍历的数组。
for i,v in ipairs(x) do
循环体
end2.4 注释
单行注释的语法为:
--注释内容多行注释的语法为:
--[[
注释内容
注释内容
--]]如果想取消多行注释,只需要在第一个--之前在加一个-即可,如:
---[[
注释内容
注释内容
--]]2.5 变量名
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 内部全局变量。
2.6 运算符
Lua中支持的运算符有算术运算符、关系运算符、逻辑运算符、其他运算符。
算术运算符
+ 加法
- 减法
* 乘法
/ 除法
% 取余
^ 乘幂
- 负号关系运算符
== 等于
~= 不等于
> 大于
< 小于
>= 大于等于
<= 小于等于逻辑运算符
and 逻辑与 A and B &&
or 逻辑或 A or B ||
not 逻辑非 取反,如果为true,则返回false !其他运算符
.. 连接两个字符串
# 一元预算法,返回字符串或表的长度2.7 模块和包
模块类似于一个封装库,从 Lua 5.1 开始,Lua 加入了标准的模块管理机制,可以把一些公用的代码放在一个文件里,以 API 接口的形式在其他地方调用,有利于代码的重用和降低代码耦合度。
Lua 的模块是由变量、函数等已知元素组成的 table,因此创建一个模块很简单,就是创建一个 table,然后把需要导出的常量、函数放入其中,最后返回这个 table 就行
模块类
module={}
module.index=1
function module.sum(a,b)
return a+b
end测试类
require "module"
print(module.index)
print(module.sum(10,20))三、安装
编译安装需要libreadline-dev依赖包,yum install -y readline-devel
cd lua-5.4.1
make linux test
make install