Lua语法入门

Lua语法入门

Nginx编程需要用到Lua语言,因此必须先入门Lua的基本语法。

1. 初识Lua

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

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

Nginx本身也是C语言开发,因此也允许基于Lua做拓展。

2. HelloWorld

CentOS7默认已经安装了Lua语言环境,所以可以直接运行Lua代码。

1)在Linux虚拟机的任意目录下,新建一个hello.lua文件

2)添加下面的内容

lua 复制代码
print("Hello World!")  

3)运行

3. 变量和循环

任何语言必然离不开变量,而变量的声明必须先知道数据的类型。

3.1. Lua的数据类型

Lua中支持的常见数据类型包括:

另外,Lua提供了type()函数来判断一个变量的数据类型:

3.2. 声明变量

Lua声明变量的时候无需指定数据类型,而是用local来声明变量为局部变量:

lua 复制代码
-- 声明字符串,可以用单引号或双引号,
local str = 'hello'
-- 字符串拼接可以使用 ..
local str2 = 'hello' .. 'world'
-- 声明数字
local num = 21
-- 声明布尔类型
local flag = true

Lua中的table类型既可以作为数组,又可以作为Java中的map来使用。数组就是特殊的table,key是数组角标而已:

lua 复制代码
-- 声明数组 ,key为角标的 table
local arr = {'java', 'python', 'lua'}
-- 声明table,类似java的map
local map =  {name='Jack', age=21}

Lua中的数组角标是从1开始,访问的时候与Java中类似:

lua 复制代码
-- 访问数组,lua数组的角标从1开始
print(arr[1])

Lua中的table可以用key来访问:

lua 复制代码
-- 访问table
print(map['name'])
print(map.name)

3.3. 循环

对于table,我们可以利用for循环来遍历。不过数组和普通table遍历略有差异。

遍历数组:

lua 复制代码
-- 声明数组 key为索引的 table
local arr = {'java', 'python', 'lua'}
-- 遍历数组
for index,value in ipairs(arr) do
    print(index, value) 
end

遍历普通table

lua 复制代码
-- 声明map,也就是table
local map = {name='Jack', age=21}
-- 遍历table
for key,value in pairs(map) do
   print(key, value) 
end

4. 条件控制、函数

Lua中的条件控制和函数声明与Java类似。

4.1. 函数

定义函数的语法:

lua 复制代码
function 函数名( argument1, argument2..., argumentn)
    -- 函数体
    return 返回值
end

例如,定义一个函数,用来打印数组:

lua 复制代码
function printArr(arr)
    for index, value in ipairs(arr) do
        print(value)
    end
end

4.2. 条件控制

类似Java的条件控制,例如if、else语法:

lua 复制代码
if(布尔表达式)
then
   --[ 布尔表达式为 true 时执行该语句块 --]
else
   --[ 布尔表达式为 false 时执行该语句块 --]
end

与java不同,布尔表达式中的逻辑运算是基于英文单词:

4.3. 案例

需求:自定义一个函数,可以打印table,当参数为nil时,打印错误信息

lua 复制代码
function printArr(arr)
    if not arr then
        print('数组不能为空!')
    end
    for index, value in ipairs(arr) do
        print(value)
    end
end
相关推荐
Cc.Y5 分钟前
Java零基础入门:可变字符串与包装类:StringBuilder、StringBuffer 与 通讯录管理系统实战
java·开发语言·python
paopaokaka_luck20 分钟前
基于springboot+vue的智慧家政管理系统(AI问答、 WebSocket实时沟通、ECharts运营分析、订单规则与服务追踪)
java·javascript·spring boot·数据分析·echarts·mybatis
sm_9267870523 分钟前
RFID 标签打印的技术实现要点与二次开发实践
java·大数据·前端·c++·编辑器
阿森_dev23 分钟前
2027 届毕设选题怎么选:30 个 Java 方向选题的实现难度排序
java·开发语言·spring boot·毕业设计·课程设计
by2099926 分钟前
C++ 多态:同一个基类接口,调用不同的函数
开发语言·c++·经验分享·多态
笔墨登场说说32 分钟前
flink bin/start-cluster.sh 帮我做成开机启动
开发语言·python
Sarvartha33 分钟前
Lambda 表达式和函数式接口
java·开发语言
计算机毕业设计杰瑞39 分钟前
【计算机毕设精品】基于SpringBoot的一体化教务与学业质量管理系统的设计与实现,附源码_增删改查_java项目_可完美运行部署_网站项目
java·spring boot·课程设计
小白学大数据1 小时前
拼多多反爬对抗实战:Scrapy 中间件化采集架构解析
开发语言·scrapy·中间件·架构
colinu1 小时前
C++ 异步任务与线程生命周期:`std::async`、`future`、`thread`、`jthread` 与协作式退出
java·jvm·c++