MoonlightL

Lua 简单入门

发表于 2018-02-21   |  分类于 后端   |  阅读数:   |  评论数:

一、前言

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

Lua 可以应用在游戏开发、独立应用脚本、Web 应用脚本、扩展和数据库插件、安全系统等场景。

笔者学习的目的主要是为了能在 Web 应用(Nginx、Redis)中使用到 Lua 脚本。

二、安装

注意:请确保安装 Lua 之前系统已安装 readline 和 readline-devel。如果没有则键入 yum install -y readline readline-devel 进行安装。

  1. curl -R -O http://www.lua.org/ftp/lua-5.3.4.tar.gz
  2. tar zxf lua-5.3.4.tar.gz
  3. cd lua-5.3.4
  4. make linux test

测试,命令行中键入 lua -v:

  1. Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio

显示 Lua 版本说明安装正确。

三、运行方式

与其他脚本语言一样,我们需要将 Lua 代码编写在文件中,后缀名为 .lua。

运行该文件的代码时,只需在命令行键入 lua xx.lua 即可。

四、语法

4.1 数据类型

Lua 中包含 8 种基本数据类型,即:nil、boolean、number、string、userdata、function、thread 和 table。

数据类型说明
nil表示无效值,在条件表达式中表示 false。
boolean布尔值,包含 true 和 false 两个值。
number表示双精度类型的实浮点数。
string表示字符串,通过双引号或单引号括住。
userdata表示任意存储在变量中的 C 数据结构
function表示 C 或 Lua 编写的函数
thread表示执行的独立线程,用于执行协同程序。
table表示一个关联数组,数组索引可以是数字或字符串。

例如:

  1. a=10
  2. str="hello world"

不需要声明变量类型,我们可以通过 type() 判断变量类型。

注意:

Lua 变量有三种类型:全局变量、局部变量和表中的域;

默认情况下,不管在哪声明的变量都是全局变量。通过 local 修饰的变量为局部变量;

变量默认值为 nil。

4.2 运算符

  1. 赋值运算符
  1. str="hello".."world" -- 通过 .. 连接字符串
  2. a,b=10,15 -- a=10,b=15
  3. c,d,e=1,2 -- c=1,b=2,e=nil
  1. 算术运算符

与其他程序设计语言类似。

  1. a,b=10,15
  2. c=a+b -- 加号
  3. d=a-b -- 减号
  4. e=a*b -- 乘号
  5. f=a/b -- 除号
  6. g=a%b -- 求余
  7. h=a^2 -- 求乘方
  8. i=-a -- 负号
  1. 关系运算符

与其他程序设计语言类似。

  1. a,b=10,15
  2. print(a>b) -- 大于
  3. print(a<b) -- 小于
  4. print(a==b) -- 等于
  5. print(a~=b) -- 不等于
  1. 逻辑运算符
  1. print(true and false) -- 与
  2. print(true or false) -- 或
  3. print(not true) -- 非
  1. 其他运算符
操作符说明
..连接两个字符串
#返回字符串或表的长度,如 #"lua"

4.3 流程控制

  1. 条件判断,有 3 种写法。
  1. -- if 语句
  2. if(true)
  3. then
  4. print("hello")
  5. end
  6. -- if .. else 语句
  7. a,b=10,15
  8. if(a>b)
  9. then
  10. print(a)
  11. else
  12. print(b)
  13. end
  14. -- if 嵌套
  15. c=20
  16. if(c>10)
  17. then
  18. if(c<30)
  19. then
  20. print(c)
  21. end
  22. end
  1. 循环,有 4 种写法。
类型说明
while 循环在条件为 true 时,让程序重复执行语句。
for 循环重复执行指定语句,重复次数在 for 中控制。可以遍历数字和泛型。
repeat .. until重复执行循环,直到指定条件为真为止。
循环嵌套循环内嵌套多个循环语句。

例如:

  1. -- while 循环
  2. a=10
  3. while(a>0)
  4. do
  5. print(a)
  6. a=a-1
  7. end
  8. -- for 循环,遍历数字
  9. for a=1,10,1 do
  10. print(a)
  11. end
  12. -- repeat .. until 循环
  13. a=10
  14. repeat
  15. print(a)
  16. a=a-1
  17. until(a<1)

4.4 数组

Lua 数组大小不固定且下标从 1 开始。

  1. arr={"h","e","l","l","o"}
  2. -- 此处使用遍历数字方式
  3. for index=1,#arr do
  4. print(arr[index])
  5. end
  6. -- 此处使用遍历泛型方式
  7. for i,v in ipairs(arr) do
  8. print(i,v)
  9. end

4.5 函数

  1. -- 案例 1
  2. function calc(a,b,c)
  3. return a+b+c
  4. end
  5. result=calc(1,2,3)
  6. print(result)
  7. -- 案例 2
  8. function getCalc(a,b,c)
  9. return a,b,c
  10. end
  11. r1,r2,r3=getCalc(1,2,3)
  12. print(r1,r2,r3)

Lua 中的函数允许返回多个值。

4.6 table

table 是 Lua 中的一个数据结构,类似于 Java 中的 Map 类型或 Javascript 中的 JSON 对象。

Lua table 使用关联数组,我们可以使用任意类型值作为数组的索引,但不能是 nil。

Lua table 大小不固定。

  1. person={}
  2. person.name="jack"
  3. person.age=20
  4. print(person[1])
  5. print(person.name)
  6. print(person["age"])

4.7 模块和包

模块类似于一个封装库。从 Lua 5.1 开始,Lua 加入标准的模块管理机制,可以将一些公用的代码放在一个文件中,以 API 接口的形式在其他地方调用,有利于代码的重用和降低代码耦合。

Lua 的模块由变量、函数等已知元素组成的 table 。

例如:

创建名为 module.lua 的文件。

  1. module={}
  2. module.index=1
  3. function module.sum(a,b)
  4. return a+b
  5. end

另一个文件引入:

  1. -- 此处 module 是文件名
  2. require "module"
  3. -- 此处 module 是引入模块中定义的名称
  4. print(module.index)
  5. print(module.sum(1,2))

五、参考资料

分享