大家好,又见面了,我是你们的朋友全栈君。
- 1、Lua简介
- 1.1 Lua是什么
- 1.2 特性
- 1.3 应用场景
- 2、Lua的安装
- 3、入门程序
- 4、Lua的基础语法
- 4.1 注释
- 4.2 定义变量
- 4.3 Lua中的数据类型
- 4.4 流程控制
- 4.5 循环
- 4.6 函数
- 4.7 表
- 4.8 模块
1、Lua简介
1.1 Lua是什么
Lua [1] 是一个小巧的脚本语言。它是巴西里约热内卢天主教大学(Pontifical Catholic University ofRio de Janeiro)里的一个由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique deFigueiredo三人所组成的研究小组于1993年开发的。 其设计目的是为了通过灵活嵌入应用程序中从而为应用程序提供灵活的扩展和定制功能。 Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行。Lua并没有提供强大的库,这是由它的定位决定的。所以Lua不适合作为开发独立应用程序的语言。Lua 有一个同时进行的JIT项目,提供在特定平台上的即时编译功能。
简单来说: Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
1.2 特性
- 支持面向过程(procedure-oriented)编程和函数式编程(functional programming);
- 自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象;
- 语言内置模式匹配;闭包(closure);函数也可以看做一个值;提供多线程(协同进程,并非操作系统所支持的线程)支持;
- 通过闭包和table可以很方便地支持面向对象编程所需要的一些关键机制,比如数据抽象,虚函数,继承和重载等。
1.3 应用场景
- 游戏开发
- 独立应用脚本
- Web 应用脚本
- 扩展和数据库插件如:MySQL Proxy 和 MySQL WorkBench
- 安全系统,如入侵检测系统
- redis中嵌套调用实现类似事务的功能
- web容器中应用处理一些过滤缓存等等的逻辑,例如nginx。
2、Lua的安装
有linux版本的安装也有mac版本的安装。。我们采用linux版本的安装,首先我们准备一个linux虚拟机。
安装步骤,在linux系统中执行下面的命令。
代码语言:javascript复制curl -R -O 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
make install
注意:此时安装,有可能会出现如下错误:
此时需要安装lua相关依赖库的支持,执行如下命令即可:
代码语言:javascript复制yum -y install gcc gcc-c kernel-devel
此时再执行lua测试看lua是否安装成功
代码语言:javascript复制[root@localhost ~]# lua
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio
3、入门程序
创建hello.lua文件,内容为
代码语言:javascript复制vim hello.lua
在文件中输入:
代码语言:javascript复制print("hello");
保存并退出。 执行命令
代码语言:javascript复制lua hellp.lua
输出为:
代码语言:javascript复制Hello
效果如下:
4、Lua的基础语法
lua有交互式编程和脚本式编程。
交互式编程就是直接输入语法,就能执行。
脚本式编程需要编写脚本,然后再执行命令 执行脚本才可以。
一般采用脚本式编程。(例如:编写一个hello.lua的文件,输入文件内容,并执行lua hell.lua即可)
(1)交互式编程
Lua 提供了交互式编程模式。我们可以在命令行中输入程序并立即查看效果。 Lua 交互式编程模式可以通过命令 lua -i 或 lua 来启用:
代码语言:javascript复制lua -i
如下图:
(2)脚本式编程
我们可以将 Lua 程序代码保持到一个以 lua 结尾的文件,并执行,该模式称为脚本式编程,例如入门程序中将lua语法写到hello.lua文件中。
4.1 注释
一行注释:两个减号是单行注释
代码语言:javascript复制--
多行注释:
代码语言:javascript复制--[[
多行注释
多行注释
--]]
4.2 定义变量
全局变量,默认的情况下,定义一个变量都是全局变量,如果要用局部变量 需要声明为local.例如:
代码语言:javascript复制-- 全局变量赋值
a=1
-- 局部变量赋值
local b=2
如果变量没有初始化:则 它的值为nil 这和java中的null不同。
如下图案例:
4.3 Lua中的数据类型
Lua 是动态类型语言,变量不要类型定义,只需要为变量赋值。 值可以存储在变量中,作为参数传递或结果返回。
Lua 中有 8 个基本类型分别为:nil、boolean、number、string、userdata、function、thread 和 table。
实例:
4.4 流程控制
(1)if语句
Lua if 语句 由一个布尔表达式作为条件判断,其后紧跟其他语句组成。 语法:
代码语言:javascript复制if(布尔表达式)
then
--[ 在布尔表达式为 true 时执行的语句 --]
end
实例:
(2)if…else语句
Lua if 语句可以与 else 语句搭配使用, 在 if 条件表达式为 false 时执行 else 语句代码块。 语法:
代码语言:javascript复制if(布尔表达式)
then
--[ 布尔表达式为 true 时执行该语句块 --]
else
--[ 布尔表达式为 false 时执行该语句块 --]
end
实例:
4.5 循环
(1)while循环[满足条件就循环 ]
Lua 编程语言中 while 循环语句在判断条件为 true 时会重复执行循环体语句。 语法:
代码语言:javascript复制while(condition)
do
statements
end
实例:
代码语言:javascript复制a=10
while( a < 20 )
do
print("a 的值为:", a)
a = a 1
end
执行效果
(2)for循环
Lua 编程语言中 for 循环语句可以重复执行指定语句,重复次数可在 for 语句中控制。 语法: 1->10 1:exp1 10:exp2 2:exp3:递增的数量
代码语言:javascript复制for var=exp1,exp2,exp3
do
<执行体>
end
语法解释:var 从 exp1 变化到 exp2,每次变化以 exp3 为步长递增 var,并执行一次 “执行体”。exp3 是可选的,如果不指定,默认为1。
例子:
代码语言:javascript复制for i=1,9,2
do
print(i)
end
for i=1,9,2 :i=1从1开始循环,9循环数据到9结束,2每次递增2
(3)repeat…until语句[满足条件结束]
Lua 编程语言中 repeat…until 循环语句不同于 for 和 while循环,for 和 while 循环的条件语句在当前循环执行开始时判断,而 repeat…until 循环的条件语句在当前循环结束后判断。(与java语法中do…while类似)
语法:
代码语言:javascript复制repeat
statements
until( condition )
案例:
4.6 函数
Lua中也可以定义函数,类似于java中的方法。例如:
代码语言:javascript复制--[[ 函数返回两个值的最大值 --]]
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))
执行之后的结果:
代码语言:javascript复制两值比较最大值为 10
两值比较最大值为 6
…:表示拼接
4.7 表
table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数组、字典等。
Lua也是通过table来解决模块(module)、包(package)和对象(Object)的。
案例:
代码语言:javascript复制-- 初始化表
mytable = {}
-- 指定值
mytable[1]= "Lua"
-- 移除引用
mytable = nil
4.8 模块
(1)模块定义(类似于Java中方法的概念) 模块类似于一个封装库,从 Lua 5.1 开始,Lua 加入了标准的模块管理机制,可以把一些公用的代码放在一个文件里,以 API 接口的形式在其他地方调用,有利于代码的重用和降低代码耦合度。
创建一个文件叫module.lua,在module.lua中创建一个独立的模块,代码如下:
代码语言:javascript复制-- 文件名为 module.lua
-- 定义一个名为 module 的模块
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中的类要引用别的类的效果。 用法:
代码语言:javascript复制require("<模块名>")
代码语言:javascript复制require "<模块名>"
两种都可以。
我们可以将上面定义的module模块引入使用,创建一个test_module.lua文件,代码如下:
代码语言:javascript复制-- test_module.lua 文件
-- module 模块为上文提到到 module.lua
require("module")
print(module.constant)
module.func3()
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/200708.html原文链接:https://javaforall.cn