博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Lua脚本语言基础语法
阅读量:3942 次
发布时间:2019-05-24

本文共 4705 字,大约阅读时间需要 15 分钟。

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。

lua的安装

有linux版本的安装也有mac版本的安装。我们采用linux版本的安装,首先我们准备一个linux虚拟机。

安装步骤,在linux系统中执行下面的命令。

curl -R -O http://www.lua.org/ftp/lua-5.3.5.tar.gztar zxf lua-5.3.5.tar.gzcd lua-5.3.5make linux test

注意:此时安装,有可能会出现如下错误:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rsP9ElkX-1619343023294)(D:\javastudy\笔记\Spring技术栈\images\1560739143890.png)]

此时需要安装lua相关依赖库的支持,执行如下命令即可:

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

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

[root@localhost ~]# luaLua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rioctrl+c退出

入门程序

创建hello.lua文件,内容为

编辑文件hello.lua

vi hello.lua

在文件中输入:

print("hello");

保存并退出。

执行命令

lua hello.lua

输出为:

Hello

效果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xA6SXoqU-1619343023297)(D:\javastudy\笔记\Spring技术栈\images\1564436327870.png)]

LUA的基本语法

lua有交互式编程和脚本式编程。

交互式编程就是直接输入语法,就能执行。

脚本式编程需要编写脚本,然后再执行命令 执行脚本才可以。

一般采用脚本式编程。(例如:编写一个hello.lua的文件,输入文件内容,并执行lua hell.lua即可)

(1)交互式编程

Lua 提供了交互式编程模式。我们可以在命令行中输入程序并立即查看效果。

Lua 交互式编程模式可以通过命令 lua -i 或 lua 来启用:

lua -ictrl + c 退出

如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eMmbTZQo-1619343023298)(D:\javastudy\笔记\Spring技术栈\images\1564436436450.png)]

(2)脚本式编程

我们可以将 Lua 程序代码保持到一个以 lua 结尾的文件,并执行,该模式称为脚本式编程,例如上面入门程序中将lua语法写到hello.lua文件中。

注释

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

--

多行注释:

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

定义变量

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

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

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

如果变量没有初始化:则 它的值为nil 这和java中的null不同。

如下图案例:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hN1SUtpM-1619343023301)(D:\javastudy\笔记\Spring技术栈\images\1564436763084.png)]

Lua中的数据类型

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 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。

实例:

type:函数,输出对象的类型

print(type("Hello world"))      --> stringprint(type(10.4*3))             --> numberprint(type(print))              --> functionprint(type(type))               --> functionprint(type(true))               --> booleanprint(type(nil))                --> nil

流程控制

(1)if语句

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

语法:

if(布尔表达式)then   --[ 在布尔表达式为 true 时执行的语句 --]end

实例:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FVmgfJGk-1619343023303)(D:\javastudy\笔记\Spring技术栈\images\1564437016055.png)]

(2)if…else语句

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

语法:

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

实例:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rJIjleW2-1619343023304)(D:\javastudy\笔记\Spring技术栈\images\1564437356737.png)]

循环

(1)while循环[满足条件就循环]

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

语法:

while(condition)do   statementsend

实例:

a=10while( a < 20 )do   print("a 的值为:", a)   a = a+1end

效果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p1oVtdVe-1619343023305)(D:\javastudy\笔记\Spring技术栈\images\1564437466576.png)]

(2)for循环

Lua 编程语言中 for 循环语句可以重复执行指定语句,重复次数可在 for 语句中控制。

语法: 1->10 1:exp1 10:exp2 2:exp3:递增的数量

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

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

例子:

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

for i=1,9,2:i=1从1开始循环,9循环数据到9结束,2每次递增2

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ICPbvgCZ-1619343023308)(D:\javastudy\笔记\Spring技术栈\images\1564437629211.png)]

(3)repeat…until语句[满足条件结束]

Lua 编程语言中 repeat…until 循环语句不同于 for 和 while循环,for 和 while 循环的条件语句在当前循环执行开始时判断,而 repeat…until 循环的条件语句在当前循环结束后判断。

语法:

repeat   statementsuntil( condition )

案例:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6rtZk6wK-1619343023309)(D:\javastudy\笔记\Spring技术栈\images\1564438640878.png)]

函数

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))

执行之后的结果:

两值比较最大值为10两值比较最大值为     6

…:表示拼接

table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数组、字典等。

Lua也是通过table来解决模块(module)、包(package)和对象(Object)的。

案例:

-- 初始化表mytable = {}-- 指定值mytable[1]= "Lua"-- 移除引用mytable = nil

模块

(1)模块定义

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

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

-- 文件名为 module.lua-- 定义一个名为 module(名字)的模块,类似java类module = {} -- 定义一个常量module.constant = "这是一个常量" -- 定义一个函数function module.func1()    print("这是一个公有函数")end local function func2()    print("这是一个私有函数!")end function module.func3()    func2()end return module

由上可知,模块的结构就是一个 table 的结构,因此可以像操作调用 table 里的元素那样来操作调用模块里的常量或函数。

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

(2)require 函数

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

用法:

require("
<模块名>
")
require "
<模块名>
"

两种都可以。

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

-- test_module.lua 文件-- module 模块为上文提到到 module.luarequire("module")print(module.constant)module.func3()

转载地址:http://ktiwi.baihongyu.com/

你可能感兴趣的文章
The Big Bang Theory歌词
查看>>
Eclipse自动注释模版
查看>>
《非诚勿扰2》台词
查看>>
《班扎古鲁白玛的沉默》仓央嘉措
查看>>
《十诫诗》仓央嘉措
查看>>
《那一世》仓央嘉措
查看>>
《我问佛》仓央嘉措
查看>>
Maven中指定得AspectJ依赖无法添加得解决方案
查看>>
Spring3注释装配的最佳实践
查看>>
Mac Vi常用键
查看>>
jchardet字符编码自动检测工具
查看>>
使用Maven Archetype生成工程报错的解决
查看>>
System.getProperty()系统参数
查看>>
Linux系统下批量删除.svn目录
查看>>
大数据行业应用趋势
查看>>
Mac + Rails3 + MongoDB的Demo工程搭建
查看>>
隐藏于Python内的设计之禅彩蛋
查看>>
VSCode配置C/C++环境
查看>>
OTB测试之Visual Tracker Benchmark v1.0全过程配置流程
查看>>
缓存在Springboot应用中的使用
查看>>