Lua脚本语言概述和基本语法

Lua概述

介绍

Lua 是一个小巧的脚本语言。它是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo三人所组成的研究小组于1993年开发的。 其设计目的是为了通过灵活嵌入应用程序中从而为应用程序提供灵活的扩展和定制功能。Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行。Lua并没有提供强大的库,这是由它的定位决定的。所以Lua不适合作为开发独立应用程序的语言。Lua 有一个同时进行的JIT项目,提供在特定平台上的即时编译功能。

简单来说:

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

特性

  • 支持面向过程(procedure-oriented)编程和函数式编程(functional programming);
  • 自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象;
  • 语言内置模式匹配;闭包(closure);函数也可以看做一个值;提供多线程(协同进程,并非操作系统所支持的线程)支持;
  • 通过闭包和table可以很方便地支持面向对象编程所需要的一些关键机制,比如数据抽象,虚函数,继承和重载等。

应用场景

  • 游戏开发
  • 独立应用脚本
  • Web 应用脚本
  • 扩展和数据库插件如:MySQL Proxy 和 MySQL WorkBench
  • 安全系统,如入侵检测系统
  • redis中嵌套调用实现类似事务的功能
  • web容器中应用处理一些过滤、缓存等等的逻辑,例如nginx。

安装

先安装一些依赖

yum install libtermcap-devel ncurses-devel libevent-devel readline-devel

下载并编译

wget http://www.lua.org/ftp/lua-5.3.5.tar.gz
tar zxf lua-5.3.5.tar.gz
cd lua-5.3.5
make linux test

此时再执行lua测试看lua是否安装成功

[root@localhost ~]# lua
Lua 5.3.5 Copyright (C) 1994-2008 Lua.org, PUC-Rio

HelloWorld入门程序

创建hello.lua文件,内容为

print("hello");

保存并退出。

执行命令

lua hello.lua

查看输出:

Hello

基本语法

注释

一行注释:两个减号是单行注释:

-- 单行注释

多行注释:

--[[
 多行注释
 多行注释
 --]]

定义变量

全局变量,默认的情况下,定义一个变量都是全局变量,

如果要用局部变量 需要声明为local.例如:

-- 全局变量赋值
a=1
-- 局部变量赋值
local b=2 

如果变量没有初始化,则它的值为nil

数据类型

Lua 是弱类型语言,变量不要类型定义,只需要为变量赋值。 值可以存储在变量中,作为参数传递或结果返回。

Lua 中有 8 个基本类型分别为:nil、boolean、number、string、userdata、function、thread 和 table。

数据类型 描述
nil 这个最简单,只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)。
boolean 包含两个值:false和true。
number 表示双精度类型的实浮点数
string 字符串由一对双引号或单引号来表示
function 由 C 或 Lua 编写的函数
userdata 表示任意存储在变量中的C数据结构
thread 表示执行的独立线路,用于执行协同程序
table Lua 中的表(table)其实是一个“关联数组”(associative arrays),数组的索引可以是数字、字符串或表类型。在 Lua 里,table 的创建是通过“构造表达式”来完成,最简单构造表达式是{},用来创建一个空表。

实例:

print(type("Hello world"))      --> string
print(type(10.4*3))             --> number
print(type(print))              --> function
print(type(type))               --> function
print(type(true))               --> boolean
print(type(nil))                --> nil

流程控制

if

Lua if 语句 由一个布尔表达式作为条件判断,其后紧跟其他语句组成。

if(condition)
then
   --[ 在condition为 true 时执行的语句 --]
end

if..else语句

Lua if 语句可以与 else 语句搭配使用, 在 if 条件表达式为 false 时执行 else 语句代码块。

if(condition)
then
   --[ condition为 true 时执行该语句块 --]
else
   --[ condition为 false 时执行该语句块 --]
end

while

Lua 编程语言中 while 循环语句在判断条件为 true 时会重复执行循环体语句。

while(condition)
do
   statements
end

for

for var=exp1,exp2,exp3 
do  
    <执行体>  
end  

var 从 exp1 变化到 exp2,每次变化以 exp3 为步长递增 var,并执行一次 “执行体”。exp3 是可选的,如果不指定,默认为1。

例:

for i=1,9,2
do
   print(i)
end

代表从1开始循环,循环数据到9结束,每次递增2

其他语言的逻辑应该是for(int i = 0;i <= 9;i ++)

repeat…until

repeat
   statements
until( condition )

这个有点像其他语言的do...while,但条件判断是反过来的,即do...while not

函数

lua中也可以定义函数,类似于java中的方法。例如:

--[[ 函数返回两个值的最大值 --]]
function max(num1, num2)

   if (num1 > num2) then
      result = num1;
   else
      result = num2;
   end

   return result; 
end
-- 调用函数
print("两值比较最大值为 ",max(10,4))
print("两值比较最大值为 ",max(5,6))

table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数组、字典等。就像PHP具有关联数组和索引数组一样(为PHP上一柱香)

Lua也是通过table来解决模块(module)、包(package)和对象(Object)的。例如string.format表示使用"format"来索引table string。

-- 初始化表
mytable = {}

-- 指定值
mytable[1]= "Lua"

mytable["Lua"]= 1

-- 移除引用
mytable = nil
-- lua 垃圾回收会释放内存

模块

定义模块

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

创建一个文件叫module.lua,在module.lua中创建一个独立的模块,代码如下:

-- 文件名为 module.lua
-- 定义一个名为 module 的模块
module = {}

-- 定义一个常量
module.constant = "这是一个常量"

-- 定义一个函数
function module.func1()
    print("这是一个公有函数")
end

local function func2()
    print("这是一个私有函数!")
end

function module.func3()
    func2()
end

return module

(这熟悉感,仿佛看到了ES6的模块)

上面的 func2 声明为程序块的局部变量,即表示一个私有函数,因此是不能从外部访问模块里的这个私有函数,必须通过模块里的公有函数来调用。

引用模块

require 用于 引入其他的模块,类似于java中的类要引用别的类的效果。

require("<模块名>")
-- 或者
require "<模块名>"

我们可以将上面定义的module模块引入使用,创建一个test_module.lua文件,代码如下:

-- test_module.lua 文件
-- module 模块为上文提到到 module.lua
require("module")

print(module.constant)

module.func3()

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/lua%e8%84%9a%e6%9c%ac%e8%af%ad%e8%a8%80%e6%a6%82%e8%bf%b0%e5%92%8c%e5%9f%ba%e6%9c%ac%e8%af%ad%e6%b3%95/