文章目录
Lua语言
根据菜鸟教程的讲述:
1、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语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。
2、特性
- 支持面向过程(procedure-oriented)编程和函数式编程(functional programming);
- 自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象;
- 语言内置模式匹配;闭包(closure);函数也可以看做一个值;提供多线程(协同进程,并非操作系统所支持的线程)支持;
- 通过闭包和table可以很方便地支持面向对象编程所需要的一些关键机制,比如数据抽象,虚函数,继承和重载等。
3、应用场景
- 游戏开发
- 独立应用脚本
- Web 应用脚本
- 扩展和数据库插件如:MySQL Proxy 和 MySQL WorkBench
- 安全系统,如入侵检测系统
- redis中嵌套调用实现类似事务的功能
- web容器中应用处理一些过滤 缓存等等的逻辑,例如nginx。
4、lua的安装
安装步骤,在linux系统中执行下面的命令。
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
可能会出现错误,可以尝试执行如下命令:
yum install libtermcap-devel ncurses-devel libevent-devel readline-devel
此时再执行lua测试看lua是否安装成功
[root@localhost ~]# lua
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio
5、lua经典Hello World!
创建hello.lua文件,内容为
编辑文件hello.lua
vi test.lua
在文件中输入:
print("hello");
保存并退出。
执行命令
lua test.lua
结果如下:
6、lua基础(很基础 很基础 很皮毛)
lua有交互式编程和脚本式编程。
交互式编程就是直接输入语法,就能执行。
脚本式编程需要编写脚本,然后再执行命令 执行脚本才可以。
一般采用脚本式编程。这里我们使用脚本编程
6.1、注释
lua的注释使用--
例如:
多行的注释使用:
--[[
--]]
例如:
6.2、定义变量
全局变量,默认的情况下,定义一个变量都是全局变量,
如果变量没有初始化:则 它的值为nil 这和java中的null不同。
如果要用局部变量 需要声明为local.例如:
-- 全局变量赋值
a=1
-- 局部变量赋值
local b=2
脚本测试代码为:
name="yxinmiracle"
local address="yaoyuandedifang"
print(name)
print("----------------")
print(address)
结果为:
6.3、 Lua中的数据类型
Lua 是动态类型语言,变量不要类型定义,只需要为变量赋值(这跟python类似)。 值可以存储在变量中,作为参数传递或结果返回。
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")) --> string
print(type(10.4*3)) --> number
print(type(print)) --> function
print(type(type)) --> function
print(type(true)) --> boolean
print(type(nil)) --> nil
print(type(type(X))) --> string
比较时应该加上双引号 ":
> type(X)
nil
> type(X)==nil
false
> type(X)=="nil"
true
>
6.4、 流程控制
(1)if语句
Lua if 语句 由一个布尔表达式作为条件判断,其后紧跟其他语句组成。
语法:
if(布尔表达式)
then
--[ 在布尔表达式为 true 时执行的语句 --]
end
实例:
代码:
num1=5
num2=10
if num1<num2 then
print("num1的值为:"..num1.."他的值比num2小,num2的值为:"..num2)
else
print("num1的值为:"..num1.."他的值比num2大,num2的值为:"..num2)
end
结果:
6.5、 循环
(1)while循环[满足条件就循环]
Lua 编程语言中 while 循环语句在判断条件为 true 时会重复执行循环体语句。
语法:
while(condition)
do
statements
end
实例:
代码:
a = 10
while( a<20 )
do
print("a的值为:", a)
a = a+1
end
结果:
(2)for循环
Lua 编程语言中 for 循环语句可以重复执行指定语句,重复次数可在 for 语句中控制。
for var=exp1,exp2,exp3 do
<执行体>
end
其中表达式的解释为:
var 从 exp1 变化到 exp2,每次变化以 exp3 为步长递增 var,并执行一次 “执行体”。exp3 是可选的,如果不指定,默认为1。
实例:
for i=1,f(x) do
print(i)
end
for i=10,1,-1 do
print(i)
end
结果:
实例2:
#!/usr/local/bin/lua
function f(x)
print("function")
return x*2
end
for i=1,f(5) do print(i)
end
结果:
function
1
2
3
4
5
6
7
8
9
10
可以看到 函数f(x)只在循环开始前执行一次。
6.6、 函数
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
6.7、表
table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数组、字典等。
Lua也是通过table来解决模块(module)、包(package)和对象(Object)的。
案例:
-- 初始化表
mytable = {}
-- 指定值
mytable[1]= "Lua"
-- 移除引用
mytable = nil
实例:
-- 简单的 table
mytable = {}
print("mytable 的类型是 ",type(mytable))
mytable[1]= "Lua"
mytable["wow"] = "修改前"
print("mytable 索引为 1 的元素是 ", mytable[1])
print("mytable 索引为 wow 的元素是 ", mytable["wow"])
-- alternatetable和mytable的是指同一个 table
alternatetable = mytable
print("alternatetable 索引为 1 的元素是 ", alternatetable[1])
print("mytable 索引为 wow 的元素是 ", alternatetable["wow"])
alternatetable["wow"] = "修改后"
print("mytable 索引为 wow 的元素是 ", mytable["wow"])
-- 释放变量
alternatetable = nil
print("alternatetable 是 ", alternatetable)
-- mytable 仍然可以访问
print("mytable 索引为 wow 的元素是 ", mytable["wow"])
mytable = nil
print("mytable 是 ", mytable)
结果:
mytable 的类型是 table
mytable 索引为 1 的元素是 Lua
mytable 索引为 wow 的元素是 修改前
alternatetable 索引为 1 的元素是 Lua
mytable 索引为 wow 的元素是 修改前
mytable 索引为 wow 的元素是 修改后
alternatetable 是 nil
mytable 索引为 wow 的元素是 修改后
mytable 是 nil
6.8、模块
(1)模块定义
模块类似于一个封装库,从 Lua 5.1 开始,Lua 加入了标准的模块管理机制,可以把一些公用的代码放在一个文件里,以 API 接口的形式在其他地方调用,有利于代码的重用和降低代码耦合度。
创建一个文件叫test5.lua,在test5.lua中创建一个独立的模块,代码如下:
module = {}
-- 定义一个常量
module.name = "这是一个常量"
-- 定义一个函数
function module.func1()
print("这是一个函数")
end
local function func2()
print("这里是func2,这是一个私有函数")
end
function module.func3()
print("这里是func3 要调用func2")
func2()
end
return module
由上可知,模块的结构就是一个 table 的结构,因此可以像操作调用 table 里的元素那样来操作调用模块里的常量或函数。
上面的 func2 声明为程序块的局部变量,即表示一个私有函数,因此是不能从外部访问模块里的这个私有函数,必须通过模块里的公有函数来调用.
(2)require 函数
require 用于 引入其他的模块,类似于java中的类要引用别的类的效果。
用法:
require("<模块名>")
require "<模块名>"
两种都可以。
创建一个test6.lua文件,代码如下:
require("test5")
print(module.name)
module.func3()
结果: