Skip to content

一、概述

Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。官网:https://www.lua.org/

Lua经常嵌入到C语言开发的程序中,例如游戏开发、游戏插件、Nginx拓展等。

跟其他语言进行比较,Lua有其自身的特点:

(1)轻量级

Lua用标准C语言编写并以源代码形式开发,编译后仅仅一百余千字节,可以很方便的嵌入到其他程序中。

(2)可扩展

Lua提供非常丰富易于使用的扩展接口和机制,由宿主语言(通常是C或C++)提供功能,Lua可以使用它们,就像内置的功能一样。

(3)支持面向过程编程和函数式编程

二、基础语法

在Lua语言中,连续语句之间的分隔符并不是必须的,也就是说后面不需要加分号,当然加上也不会报错

2.1 运行

shell
#通过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 编写的函数
tableLua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字、字符串或表类型。在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。
thread线程,thread用来表示执行的独立线路,用来执行协同程序。
userdata用户数据,是一种用户自定义数据,用于表示一种由应用程序或C/C++语言库所创建的类型。

声明变量

lua
-- 声明字符串,可以用单引号或双引号,
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 逻辑处理

遍历

lua
-- 声明数组 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

条件判断

lua
-- 逻辑判断基于英文单词  and or not
if(布尔表达式) then
   --[ 布尔表达式为 true 时执行该语句块 --]
elseif(布尔表达式) then
    
else
   --[ 布尔表达式为 false 时执行该语句块 --]
end

循环

lua
-- 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
	循环体
end

2.4 注释

单行注释的语法为:

--注释内容

多行注释的语法为:

--[[
	注释内容
	注释内容
--]]

如果想取消多行注释,只需要在第一个--之前在加一个-即可,如:

---[[
	注释内容
	注释内容
--]]

2.5 变量名

Lua定义变量名以一个字母 A 到 Z 或 a 到 z 或下划线 _ 开头后加上0个或多个字母,下划线,数字(0到9)。这块建议大家最好不要使用下划线加大写字母的标识符,因为Lua的保留字也是这样定义的,容易发生冲突。注意Lua是区分大小写字母的。

关键字

下列是Lua的关键字,大家在定义常量、变量或其他用户自定义标识符都要避免使用以下这些关键字:

andbreakdoelse
elseifendfalsefor
functionifinlocal
nilnotorrepeat
returnthentrueuntil
whilegoto

一般约定,以下划线开头连接一串大写字母的名字(比如 _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 就行

模块类

lua
module={}

module.index=1

function module.sum(a,b)
  return a+b
end

测试类

lua
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